Google Apps ScriptでGmailからメールを自動送信してみる [初級編]

# まずはじめに
もし気に入っていただけたり、役に立ったらぜひ　”いいね！”　お待ちしております！
投稿のモチベーションに繋がります^^¥

# この記事の目的
Google Apps Script（GAS）を使って、スプレッドシートの列に記載されているメールアドレスに定型文を自動送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/f954b1e2-ec03-9e7f-3001-abf95431731f.png)

# Google Apps Script（GAS）とは
Googleが提供するサーバーレスのプログラミング環境です。略称でGASとよく呼ばれます。ちなみに発音は、ガ（↓）ス（↑）。

Googleが提供する11のサービスをクラウド上でスクリプトを実行することで操作できるサービスで、
スクリプトの言語は、JavaScriptをベースとしています。

「Excelのマクロと同じ」と言われることもありますが、これは正しくありません。
スプレッドシートだけを操作する場合は、Excelのマクロと似ていますが、Google Apps Scriptはより幅広い用途に使用できます。

- カレンダー
- コンタクト
- ドライブ
- ドキュメント
- スプレッドシート
- フォーム
- Gmail
- グループ
- マップ
- サイト

スクリプトを組み合わせることで、

- 毎朝8時にGmail起動し、Googleカレンダーの予定をテキストで特定のアドレスに送信する
- Googleカレンダーに登録されている特定期間のスケジュールを抽出する
- WebAPIを返す
 
などなど、できちゃいます。（便利そうじゃないですか？）


# Google Apps Scriptを使ってみよう
まず、適当なスプレッドシートを作成しましょう。

```ツール -> スクリプトエディタ``` でエディタが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/00418409-0699-4600-e74f-654ce4d2c10b.png)

こいつのシート名は、```シート1```(デフォルト)のままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/4c280107-ce81-fbda-ed44-6186cd07fb3d.png)


初期のエディタ画面はこんな感じ。
よく使うボタンは赤文字で書いています。
一般的には```時計アイコン```でトリガーを設定し、
```時刻になったらメールを送信する```
```スプレッドシートに書き込みがあったら送信する```

などの使い方をします。

```function '関数名'{}```の大カッコのなかにプログラムを書いていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/f30610fd-1fa4-52da-ca08-f0ca5ba190fb.png)



## サンプルスクリプト

変数```ss```に、```シート1```がシート名のアクティブなスプレッドシートを取得させます。


```javascript
var ss = SpreadsheetApp.getActive().getSheetByName('シート1');
```

変数```today```、送信時間をメールテキストで表現できるよう、フォーマットします。

```javascript
var today = Utilities.formatDate(new Date(), 'JST', 'yyyy年M月d日 H時m分s秒');
```

変数```MailTitle```に、メール件名を定義します。

```javascript

var MailTitle = 'hogehoge'
```

スプレッドシートの最終行まで取得します。
変数```lastlow```に定義します。

```javascript
var lastRow = ss.getLastRow();
```


for文で処理を繰り返します。```i=2```なので、```(i, 3)```はスプレッドシートの2行3列目、つまり```送信対象```のセル列を参照しています。
それを、```i<=lastRow```で最終列まで指定し、```i++```で1行ずつ回しています。

```javascript

for(var i=2; i<=lastRow; i++){
    if (ss.getRange(i, 3).getValue() == "送信対象"){
      var rangeA = ss.getRange('A' + i).getValue(); //送信対象のA列を最終行まで取得していく。それを ' rangeA ' という変数に格納
      var rangeB = ss.getRange('B' + i).getValue(); //送信対象のB列を最終行まで取得していく。それを ' rangeB ' という変数に格納
```

メール本文を変数```MailText```に定義します。
引数として、```rangeB(シートだとName部)```と```today(フォーマットした時間)```をとっています。

```javascript
var MailText = rangeB+"さん"+"\n\nお疲れ様です。\n本日"+today+"時点でのメールを送ります。\n";
```

GmailAppを呼び出します。
呼び出しには```GmailApp.sendEmail(宛先, 件名, 本文)```というように記載します。


rangeAにはシート部でいう```メールアドレス```を指定し、後に```メール件名(MailTitle)```と```メール本文(MailText)```を引数で指定しています。


```javascript

GmailApp.sendEmail(rangeA,
                   MailTitle,
                   MailText)
```



## スクリプト全体
```javascript

function SendMail(){
  // 対象のシートを指定
  var ss = SpreadsheetApp.getActive().getSheetByName('シート1');
 
  // 送信時間をメールテキストで表現できるよう、フォーマット
  var today = Utilities.formatDate(new Date(), 'JST', 'yyyy年M月d日 H時m分s秒');
  
  // メールタイトルを変数で定義
  var MailTitle = "hogehoge";
  
  // スプレッドシートの最終行まで取得。よく使う
  var lastRow = ss.getLastRow();
  
  // 繰り返し処理を実施
  for(var i=2; i<=lastRow; i++){
    if (ss.getRange(i, 3).getValue() == "送信対象"){
      var rangeA = ss.getRange('A' + i).getValue(); //送信対象のA列を最終行まで取得していく。それを ' rangeA ' という変数に格納
      var rangeB = ss.getRange('B' + i).getValue(); //送信対象のB列を最終行まで取得していく。それを ' rangeB ' という変数に格納
      
      // メール本文を変数で定義。rangeBの変数は送信時の宛名を入れておく
      // todayは送信時の日付と時間を表現させる
      var MailText = rangeB+"さん"+"\n\nお疲れ様です。\n本日"+today+"時点でのメールを送ります。\n";
    }
  
  
    GmailApp.sendEmail(rangeA,
                       MailTitle,
                       MailText)
  }
}
```


## 実行権限の許可
実行ボタンからメールを送信しようとすると、初回操作なので承認を求められます。
```許可を確認```を押下し、スクリプトの実行を許可します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/b30fe964-2d85-dbcb-9749-9d0ecdb8babb.png)

マスクしていますが、スクリプトの実行を許可させるGoogleアカウントを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/f0b2c957-6aad-bc4f-12fb-f3547357aea2.png)

詳細を押下し、赤枠のページに遷移します。
```Gmail送信（安全ではないページ）```に移動します。
表現がかなり危険そうですが...まあ大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/e4a72ef3-e415-f7e6-36ea-f6b4a4bf8d78.png)


```許可``` を押下します。
Googleからセキュリティ通知が来ると思いますが、大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/6f17bc07-341c-6a25-89cd-a50f27b72a93.png)


## スプレッドシートの状態
以下の通り、```tnoce```と```ジョン```を宛名にして、それぞれのメールアドレスに
```件名：hogehoge```
```本文：rangeB+"さん"+"\n\nお疲れ様です。\n本日"+today+"時点でのメールを送ります。\n"```
のメールが届けば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/19749c86-0c5c-9f3a-54be-cb52a631e08b.png)


##  メール送信を実行していく
許可が済んだところで、では実行していきます。
```▶```を押下ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/2a126218-7952-de05-e2a6-ca70e2936f3b.png)



## tnoce側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/516fa138-dde3-7fcb-e98f-5619919d6534.png)

## ジョン側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/7a08386e-98cb-02d4-0f54-d32b1f97b421.png)


ちゃんと届いたようです！！

# トリガーを作る
気が変わったので、トリガーを作成しましょう。笑
赤枠のアイコンから作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/fbd7ac38-972d-b35f-9c92-98165ad9763f.png)

初期の状態だと当然なにもトリガーがありません。画面右下のトリガー追加から追加しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/33eb142c-7a2a-f6a9-cbb9-a812b0ae8ab2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/63980843-4140-c38e-5742-aa9c6872ce30.png)

今回は```時間主導型```で```毎週月曜日```の```PM1時〜2時```の間にメールが送信されるようにトリガーを作ります。
関数は、先程作成した```SendMail```を指定しています。選択が完了したら保存を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/e2076769-cfd4-273d-14bd-1bc03b108c8b.png)

無事トリガーが作成されました。
これで、```毎週月曜日```の```PM1時〜2時```の間にメールが送信されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/abc1160d-3b52-c029-3a02-781dc90e1c02.png)


# 最後に
今回は、汎用的に使えるGmailの自動送信をご紹介しました。
プログラムに慣れている人からは簡単だったのではないでしょうか。

タイムトリガーやイベントトリガーと組み合わせることによって、もっと便利に使えるので、いろいろ試してみてください。