メルマガ風メールにデータを添付して送る

今回作成したのは、前回作成した記事「Googleスプレッドシート – メルマガ風一括送信」の応用です！
メールを一括配信したいけどメールにデータも添付する形で送りたいなぁ。。。って場合に活用ください！


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

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


##1.シート名：「メール詳細」を作成
前回同様送信する為のテンプレを作成します。<br>以下を参考に作成してみてください！

<figure class="wp-block-image"><img src="https://bzbot.work/wp-content/uploads/2019/02/image-42.png" alt="メールフォーマット - bzbot（ビジボット）" class="wp-image-1440"/>

『メール送信フォーマット』では、プログラムで値が変わる部分と固定で変わらない部分があります。
『③cc』と『④subject』は完全な固定、『⑤body』は『⑥本文』で作った文章と『①担当者名』の名前を関数でくっつけている為、ハイブリット形式。それ以外はGASで都度可変です！

ちなみにハイブリット形式のところに入っている関数は以下


![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/5ecdc12b-7c86-e416-4f03-17f954090015.png)


##2.シート名：「メーリングリスト」を作成

メーリングリストはA列に担当者、B列にアドレスを入れて一覧を作ります。
※アドレスに空欄があるとエラーになるので、注意（今度気が向いたらエラー処理ちゃんと入れます..）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/c9a2036f-8583-dd38-e031-c47a2fd0fda5.png)


```javascript:GAS
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  //「メーリングリスト」のシートをアクティブにして、シート情報をmListに取得
  var mList = sheet.setActiveSheet(sheet.getSheetByName("メーリングリスト"));
  //「メール詳細」のシートをアクティブにして、シート情報をbTempに取得
  var mTemp = sheet.setActiveSheet(sheet.getSheetByName("メール詳細"));

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

ログ結果は以下です。

```
[19-02-14 02:46:01:657 JST] 【lastR】：6
[19-02-14 02:46:03:320 JST] 【mlvalue】：担当者名,アドレス,担当1,bzbot@bzbot.work,担当2,bzbot@bzbot.work,担当3,bzbot@bzbot.work,担当4,bzbot@bzbot.work,担当5,bzbot@bzbot.work
[19-02-14 02:46:03:680 JST] 【mlvalue[1][0]】：担当1
[19-02-14 02:46:03:682 JST] 【mlvalue[1][0]】：bzbot@bzbot.work
[19-02-14 02:46:05:599 JST] 【mlvalue[2][0]】：担当2
[19-02-14 02:46:05:601 JST] 【mlvalue[2][0]】：bzbot@bzbot.work
[19-02-14 02:46:07:679 JST] 【mlvalue[3][0]】：担当3
[19-02-14 02:46:07:681 JST] 【mlvalue[3][0]】：bzbot@bzbot.work
[19-02-14 02:46:09:614 JST] 【mlvalue[4][0]】：担当4
[19-02-14 02:46:09:616 JST] 【mlvalue[4][0]】：bzbot@bzbot.work
[19-02-14 02:46:10:988 JST] 【mlvalue[5][0]】：担当5
[19-02-14 02:46:10:991 JST] 【mlvalue[5][0]】：bzbot@bzbot.work
```


コードの解説です。

```javascript:GAS
function goGoM(){
  
  //取得したmListの最終行を取得する
  var lastR = mList.getLastRow();
  Logger.log("【lastR】：" + lastR);
  var cnt = lastR - 1;
  
  //lastRは最初から最後の行までをカウントしているので、対象となるデータが入っている個数をカウントしてしまってます。
  var popUp = Browser.msgBox("送信確認！","送信対象数"+cnt+"件です。実行しますか？", Browser.Buttons.OK_CANCEL);
  if (popUp == 'ok') {
//TRUE（YES）を押されたときの挙動を記載

  }else {
//FALSE（NO）を押されたときの挙動を記載
    Browser.msgBox("キャンセルしました");
  }
}
```

配信する情報を取得した最終行までのリスト情報を変数 mlvalue へ取得します。
メールに添付するファイルを探します。DriveApp.getFolderById('**************');でGoogleDrive内にあるデータのフォルダIDを指定します。
※フォルダIDは以下場所の箇所に記載されているIDをセットします

![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/e17d8a2b-9354-b061-5834-05265a72c2a6.png)


取得したIDにあるファイル名（関数一覧.pdf）に一致するデータを探します。

```javascript:GAS
//取得した最終行までの情報を配列で取得する
var mlvalue = mList.getRange(1, 1, lastR, 2).getValues();
Logger.log("【mlvalue】：" + mlvalue);
    
var folder = DriveApp.getFolderById('**************'); 
var Files = folder.getFilesByName('関数一覧.pdf');
var attachmentFiles  = Files.next();
```


最後に送信処理の記述です。
for文で最終行で取得した値まで処理を繰り返しながら、取得した値を一つずつ取り出してスプレッドシートにセットします。スプレッドシートにセットしたらその情報でGmailApp.sendEmail()関数に引数を渡します。

この渡すタイミングでデータファイルの指定を『{attachments:attachmentFiles}』このような形で指定する必要があります。『{attachments:こっちは取得したファイル名がセットされた変数名}』


```javascript:GAS
//lastRは6だが、1行目はタイトルなのでX回繰り返して欲しいため、iがより大きい場合は実行終了とする
  for(var i = 1; i < lastR; i++) {
    Logger.log("【mlvalue[" + i + "][0]】：" + mlvalue[i][0]);
    //mlvalueで取得した値を「内容テンプレ」の担当者名にセット
    mTemp.getRange(2, 2).setValue(mlvalue[i][0]);
    Logger.log("【mlvalue[" + i + "][0]】：" + mlvalue[i][1]);
    //mlvalueで取得した値を「内容テンプレ」のアドレスにセット
    mTemp.getRange(3, 2).setValue(mlvalue[i][1]);
    //宛先と担当者名をセットし終わったら送信情報を取得
    var add = mTemp.getRange(3,2).getValue();
    var cc = mTemp.getRange(4,2).getValue();
    var mailSubject = mTemp.getRange(5,2).getValue();
    var mailBody =mTemp.getRange(6,2).getValue();
    //送信情報をセットして送信！
    GmailApp.sendEmail(add, mailSubject, mailBody,{attachments:attachmentFiles});
  }
    Browser.msgBox("送信しました");  
```


このような形で指定した件名、宛先、本文、添付ファイルと、実行が完了しました！
添付したファイルはしっかりと開いて閲覧することも問題なかったので完了です！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/8d09b0f6-db58-cbb0-194c-ce6071535170.png)