Googleスプレッドシート – メルマガ風一括送信

今回はタイトル通り、
スプレッドシートにメールアドレスの一覧リストがあれば、それを順番に送信するプログラムを作成しました。
正直、担当者が抜けてるとかアドレスが抜けてるとか、そういったチェック処理はしてないです。（笑）

以下様々なGASの記事を紹介してます！
https://bzbot.work/

紹介記事
今回紹介している記事は以下です！
https://bzbot.work/2019/02/03/spreadsheet-email-2/

##アドレス一覧シート
ここでは送信する宛先と担当者の名前を一覧で登録しておくシートで、数式など利用はしておらずそのままのデータを登録するイメージです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/2808060d-e9cf-eff1-adbc-84b3f73acc2e.png)


##内容テンプレシート
ここでは送信するための内容（本文）にあたる部分を書いていきます。
送信する人によって本文を毎回変えて送っていることはあまりないと思うので、内容（本文）のテンプレートを作っていきます。
※「宛先」と「担当者名」はプログラムで自動取得するため、空欄にしておいてください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/c27396ce-1f95-ce69-8ddc-b537bdc99560.png)


##メールテンプレ
ここでは最終的に送信する宛先と件名（統一）、本文を入れてます。
Toには以下数式を入れておきます。

=’内容テンプレ’!B1

次にSubjectですが、ここもメールによって内容変えることはあまりないと思うので今回は「メルマガ風一括送信」とつけます。
※コピペだとシングルクォートが全角になってしまう場合があります

最後にBodyですが、以下を入れておきます。

=’内容テンプレ’!B2&” さま”&char(10)&’内容テンプレ’!B3

すると、内容テンプレで取得した値を担当者であれば「さま」をつけた形にするなどカスタムできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/ec868b2a-4c98-836b-391e-5d04ef0690a2.png)


```javascript:GAS
function goGoMM() {
//アクティブシートで指定した（こっちの方が一般的ね（笑））
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  
  //「メーリングリスト」のシートをアクティブにして、シート情報をmListに取得
  var mList = sheet.setActiveSheet(sheet.getSheetByName("メールリスト"));
  //「内容テンプレ」のシートをアクティブにして、シート情報をbTempに取得
  var bTemp = sheet.setActiveSheet(sheet.getSheetByName("内容テンプレ"));
  //「メールテンプレ」のシートをアクティブにして、シート情報をmTempに取得
  var mTemp = sheet.setActiveSheet(sheet.getSheetByName("メールテンプレ"));

  //取得したmListの最終行を取得する
  var lastR = mList.getLastRow();
  Logger.log("【lastR】：" + lastR);

  //lastRは最初から最後の行までをカウントしているので、対象となるデータが入っている個数をカウントしてしまってます。（タイトルもカウントしているってこと）
  var popUp = Browser.msgBox("送信確認！","送信対象数"+lastR+"件です。（1行目もカウントしてます）実行しますか？", Browser.Buttons.OK_CANCEL);
  if (popUp == 'ok') {
    
    //取得した最終行までの情報を配列で取得する
    var mlvalue = mList.getRange(1, 1, lastR, 2).getValues();
    Logger.log("【mlvalue】：" + mlvalue);
  
    //lastRは6だが、1行目はタイトルなのでX回繰り返して欲しいため、iがより大きい場合は実行終了とする
    for(var i = 1; i < lastR; i++) {
      Logger.log("【mlvalue[" + i + "][0]】：" + mlvalue[i][0]);
      //mlvalueで取得した値を「内容テンプレ」の宛先にセット
      bTemp.getRange(1, 2).setValue(mlvalue[i][0]);
      Logger.log("【mlvalue[" + i + "][0]】：" + mlvalue[i][1]);
      //mlvalueで取得した値を「内容テンプレ」の担当者名にセット
      bTemp.getRange(2, 2).setValue(mlvalue[i][1]);
      //宛先と担当者名をセットし終わったら送信情報を取得
      var add = mTemp.getRange(1,2).getValue();
      var mailSubject = mTemp.getRange(2,2).getValue();
      var mailBody =mTemp.getRange(3,2).getValue();
      //送信情報をセットして送信！
      GmailApp.sendEmail(add, mailSubject, mailBody);
    }
    Browser.msgBox("送信しました");
  }
  else {
    Browser.msgBox("キャンセルしました");
  }
}
```


上記実行すると、以下ログが出力されます。

```
[19-02-03 07:22:59:721 JST] 【lastR】：6
[19-02-03 07:23:15:837 JST] 【mlvalue】：メール,担当者名,bzbot@bzbot.work,担当A,bzbot@bzbot.work,担当B,bzbot@bzbot.work,担当C,bzbot@bzbot.work,担当D,bzbot@bzbot.work,担当E
[19-02-03 07:23:15:838 JST] 【mlvalue[1][0]】：bzbot@bzbot.work
[19-02-03 07:23:15:840 JST] 【mlvalue[1][0]】：担当A
[19-02-03 07:23:16:253 JST] 【mlvalue[2][0]】：bzbot@bzbot.work
[19-02-03 07:23:16:255 JST] 【mlvalue[2][0]】：担当B
[19-02-03 07:23:16:804 JST] 【mlvalue[3][0]】：bzbot@bzbot.work
[19-02-03 07:23:16:806 JST] 【mlvalue[3][0]】：担当C
[19-02-03 07:23:17:204 JST] 【mlvalue[4][0]】：bzbot@bzbot.work
[19-02-03 07:23:17:206 JST] 【mlvalue[4][0]】：担当D
[19-02-03 07:23:17:665 JST] 【mlvalue[5][0]】：bzbot@bzbot.work
[19-02-03 07:23:17:666 JST] 【mlvalue[5][0]】：担当E
```

上記実行すると、「メールリスト」に入っているメーリングリストに対して担当者名とアドレスが取得され、送信したらまた次の値（担当者名とアドレス）をセットして送信を繰り返します。
繰り返す回数としては「メールリスト」の最終行文処理を繰り返すとしています。
※表示用の変数を用意すればしっかりと「lastR – 1」で正確な値5が出てくる記述は容易です（笑）


これでメールマガジン的な配信も簡単にできますね。
コードの可読性だったりは今勉強中なので精進します＿φ(￣ー￣ )