【GAS】スプレッドシートから自動メール送信を実現



今回はスプレッドシートで自動メール送信の実装をします。

# 事前準備
## スプレッドシート
![スクリーンショット 2020-12-14 12.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/4a1ee381-fcba-8407-8d96-4b1f1b79dfc3.png)
スプレットシートの1行目は項目行とします。
A列「名前」
B列「メールアドレス」
C列「件名」
D列「メッセージ」
E列「送信確認」

## 内容を記述
![スクリーンショット 2020-12-14 12.32.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/0f04cf2c-07cf-7c97-6a5f-20fcbe26bb52.png)

## スクリプトエディタを開く
ツール > スクリプトエディタ 
を選びます。

# コーディング
以下のコードを書きます。

```javascript
function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var EMAIL_SENT = "送信済み";
  var lastrow = sheet.getLastRow();
  var lastcolumn = sheet.getLastColumn();
  var dataRange = sheet.getRange(2,2,lastrow-1,lastcolumn-1)
  var data = dataRange.getValues();
 for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[0]; //B列
    var message = row[2]; //D列
    var emailSent = row[3]; //E列
  if (emailSent != EMAIL_SENT) { 
   var subject = row[1];//C列
    MailApp.sendEmail(emailAddress, subject, message);
    sheet.getRange(2 + i,lastcolumn).setValue(EMAIL_SENT);
    SpreadsheetApp.flush();
      }
    }
 }
```

## 説明
それでは、コードの中身について見てみましょう。

```javascript
//スプレッドAppを呼出し
  var sheet = SpreadsheetApp.getActiveSheet();  //アクティブなシートを取得
  var EMAIL_SENT = "送信済み"; 
  var lastrow = sheet.getLastRow(); //シートに記載されている最終行を取得
  var lastcolumn = sheet.getLastColumn();
  var dataRange = sheet.getRange(2,2,lastrow-1,lastcolumn-1)
  var data = dataRange.getValues();
```

`var sheet = SpreadsheetApp.getActiveSheet();`
これは、今開いているシートを取得するという意味です。

`var lastrow = sheet.getLastRow();`
スプレッドシートの最終行を取得するGoogle Apps Script(GAS)の方法として、getLastRowメソッドが用意されています。

このメソッドを使うとシート内のセルを調べ、データが入っているセルの最終行を教えてくれます。

`var lastcolumn = sheet.getLastColumn();`
getLastColumn()でシートに記載されている最終列が取得することができます。getLastRow()と併せて使えば最終セルの取得も可能になります。

`var dataRange = sheet.getRange(2, 2, lastrow-1,lastcolumn-1)`
2行目2列目から最後の行と列まで選択します。
![スクリーンショット 2020-12-14 12.01.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/19ff4c4c-2251-fa1b-0fb4-a8ef30ef7541.png)
`var data = dataRange.getValues();`
`range.getValues`は、値を二重配列で取得します。この場合上画像のピンクで囲まれている範囲の値を取得してきます。

```javascript

 for (var i = 0; i < data.length; ++i) {
    var row = data[i]; //行を選択
    var emailAddress = row[0]; //B列(メールアドレス)
    var message = row[2]; //D列(本文)
    var emailSent = row[3]; //E列 
  if (emailSent != EMAIL_SENT) { // '送信済み'有無の確認
  // `送信済み`がない時
   var subject = row[1]; //C列(件名)
    MailApp.sendEmail(emailAddress, subject, message); //メール送信
    sheet.getRange(2 + i,lastcolumn).setValue(EMAIL_SENT); 
    SpreadsheetApp.flush(); //// 変更内容を即反映
      }
    }
```
`送信済み`と書かれていない行のメールを一斉送信します。

##### getRangeの引数について
`var range = sheet.getRange(1, 4);`の場合
1行4列の範囲を指定。

`sheet.getRange(2 + i,lastcolumn).setValue(EMAIL_SENT); `
E列に`送信済み`を記入します。

## プログラム実行
虫マークをクリックします。すると、
`このアプリは確認されていません`というメッセージが出てきます。画像のように詳細を選択しましょう。
![スクリーンショット 2020-12-14 10.35.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/eade2644-97e2-702c-add3-9db638ab5206.png)

アコーディオンが開きます。赤で囲んだ(自分で名前をつけたスクリプトエディタ)に移動を選択。
![スクリーンショット 2020-12-14 10.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/08c58664-a5a6-e621-6836-d60284a5fa49.png)

このような画面になるので、ここの画面で許可を選択しましょう。
![スクリーンショット 2020-12-14 10.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/df499d1f-98a8-f0c5-3b1d-0a695fcd3fd9.png)

元のスクリプトエディタに戻るので、虫マーク -> 三角マークをクリックして、プログラムを実行しましょう。

メールの送信が済んだら送信確認列に送信済みと表示されるので、再度送信する場合は送信済みの文字列を削除すれば大丈夫です。

# プログラムを定時に実行する
![スクリーンショット 2020-12-14 14.05.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/74f1555c-d554-b9ec-23ec-e5d8ac1386b2.png)
この時計マークをクリックします。
すると、以下のような画面に切り替わると思います。
![スクリーンショット 2020-12-14 14.03.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/8220d41a-d65b-f079-f292-5305b58844b6.png)
右下のトリガーを追加をクリックします。
![スクリーンショット 2020-12-14 12.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/c529e39a-aa40-cb67-1f0c-1415c99aeb62.png)
イベントのソースを選択で、
**時間手動型**を選択します。
時間ベースでプログラムを実行したい場合は、
**時間ベースのタイマー**を選択します。他にも分ベース、日ベース、週ベースで設定することもできるので、自分に合った時間設定を選びましょう。

時間ベースの場合、最後に間隔を選択します。
これらを設定したら、プログラムが自動で実行されるでしょう。

***
お疲れ様です。
以上で、スプレッドシートから自動でメールを送信するコードの解説を終了します。
ここまでご覧いただき、ありがとうございました。