【初心者も爆速で実装】Spreedsheetsのメールアドレスに自動送信

シェアハウスの同居人が、一件一件同じ内容のメールを会社名と担当者名だけ変えて1000件くらい送っていると聞いて、途方もなくなったので作りました。
スプレッドシートの配置や中身が変わっても簡単に応用できるので、ご活用ください。


#スクリプトシートを開く

※Gmailを使っている前提で書いています。

<img width="596" alt="スクリーンショット 2018-06-05 12.10.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/161088/74194d13-ed4b-897a-8b05-c1ace72d2494.png">

こんな感じで、データがあるとします。
ツールから、スクリプトエディタを選択します。

<img width="593" alt="スクリーンショット 2018-06-05 12.02.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/161088/9b76a8ee-366e-c959-5d06-32f198bc206a.png">

すると、コードが書けそうな画面が出てきます。

<img width="214" alt="スクリーンショット 2018-06-05 15.24.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/216701/6077fc00-164b-8ce4-7bf1-d1646e3b284b.png">

以下のコードをそのままコピぺ。

```js:コード.gs
var DEBUG_FLG = 0; // 0のときメール送信

function sendArticleCountEmails(){
  var tomail = "";
  var mailTitle = "";
  var mailMsg = "";
  var opt = new Object();
  var format = 
    "<strong>この度は、弊社の〇〇〇〇という〇〇〇〇をサポートサービスを開発したのでご連絡いたしました。<br><br></strong>"
  + "ご不明点など、ございましたらご連絡ください。<br><br>"
  + "***********************************************************<br>"
  + "株式会社〇〇〇〇<br>"
  + "〇〇〇〇〇〇〇〇<br>"
  + "<br>"
  + "お問い合せ先：〇〇〇〇〇〇〇〇〇〇〇〇<br>"
  + "〇〇〇〇@〇〇.〇〇<br>"
  + "<br>"
  + "サポート受付時間：営業日9時30分～18時30分<br>"
  + "***********************************************************";
  
  // スプレットシートからデータを引き出す
  var mailMagaginSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
  var numColumn = mailMagaginSheet.getLastColumn(); // 最後列の列番号を取得
  var numRow = mailMagaginSheet.getLastRow()-1;       // 最後行の行番号を取得
  var dataRange = mailMagaginSheet.getRange(2, 1, numRow, numColumn);
  var data = dataRange.getValues();

  for(i in data){
    var rowData = data[i];
    var organization = rowData[0];
    var emailAddress = rowData[1];
    var states       = rowData[2];
    var city         = rowData[3];
    var times        = rowData[4];
    var proval       = rowData[5];
    var name         = rowData[6];
    
    mailTitle =  "【テスト通知】お知らせ";
    mailMsg = organization + "<br>" + name + "様<br><br>" + format; // 本文
    opt.htmlBody = mailMsg; // optに本文を格納
    if(0 == DEBUG_FLG && "許可" == proval){
      MailApp.sendEmail(emailAddress, mailTitle, "", opt);
      rowData[4] = times + 1;
    } else {
      Logger.log(emailAddress);
      Logger.log(mailTitle);
      Logger.log(opt);
    }
  }
  dataRange.setValues(data);
}
```

このまま保存を押すと、プロジェクトのファイル名の変更を聞かれるので、とりあえず「メルマガ配信」と名前をつけます。

<img width="591" alt="スクリーンショット 2018-06-05 12.28.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/161088/0b93fe90-258d-da62-137e-0dbab0f1ee45.png">


#コード解説

コードを順番に解説すると、

```js:コード.gs
  var tomail = "";
  var mailTitle = "";
  var mailMsg = "";
  var opt = new Object();
  var format = 
    "<strong>この度は、弊社の〇〇〇〇という〇〇〇〇をサポートサービスを開発したのでご連絡いたしました。<br><br></strong>"
  + "ご不明点など、ございましたらご連絡ください。<br><br>"
  + "***********************************************************<br>"
  + "株式会社〇〇〇〇<br>"
  + "〇〇〇〇〇〇〇〇<br>"
  + "<br>"
  + "お問い合せ先：〇〇〇〇〇〇〇〇〇〇〇〇<br>"
  + "〇〇〇〇@〇〇.〇〇<br>"
  + "<br>"
  + "サポート受付時間：営業日9時30分～18時30分<br>"
  + "***********************************************************";
  
```
この辺は、定義です。
formatの〇〇〇〇のところを、御社に沿った感じにして、追加でメルマガっぽくしていただいて大丈夫です。
※htmlのコードをそのまま書けます。

```js:コード.gs
// スプレットシートからデータを引き出す
  var mailMagaginSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
  var numColumn = mailMagaginSheet.getLastColumn()-1; // 最後列の列番号を取得
  var numRow = mailMagaginSheet.getLastRow()-1;       // 最後行の行番号を取得
  var dataRange = mailMagaginSheet.getRange(2, 1, numRow, numColumn);
  var data = dataRange.getValues();
```

まず、シート1からデータを取る定義をします。シート1はデフォルトですが、シートの名前を変えればそのシート名を探してきます。
次に、指定範囲を設定します。今回は、シートの一番上の部分はいらないので、その列以外全てを見るように設定しました。

```js:コード.gs
for(i in data){
    var rowData = data[i];
    var organization = rowData[0];
    var emailAddress = rowData[1];
    var states       = rowData[2];
    var city         = rowData[3];
    var times        = rowData[4];
    var proval       = rowData[5];
    var name         = rowData[6];
    
    mailTitle =  "【テスト通知】お知らせ";
    mailMsg = organization + "<br>" + name + "様<br><br>" + format; // 本文
    opt.htmlBody = mailMsg; // optに本文を格納
    if(0 == DEBUG_FLG && "許可" == proval){
      MailApp.sendEmail(emailAddress, mailTitle, "", opt);
      rowData[4] = times + 1;
    } else {
      Logger.log(emailAddress);
      Logger.log(mailTitle);
      Logger.log(opt);
    }
  }
```
１列ずつ、左から順番にデータを見ていきます。
mailTitleは、お好きなメルマガのタイトルをご記入ください。
mailMsgは、企業名と担当者名が入り、上の方で定義したformatがそのまま入ります。
一番上のグローバル変数で定義してあるDEBUG_FLGが0で、スプレッドシートの送信許可が許可の場合、メールが自動送信されていきます。

```js:コード.gs
dataRange.setValues(data);
```

最後に、何回送信したかわかるように、送信されたものには+1されるようにしたので、スプレッドシートを一括更新。


#デバッグして確認


42行目のメール送信のところの、行数のところをクリックしてください。

<img width="609" alt="スクリーンショット 2018-06-05 13.19.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/161088/cd0a19de-eabe-7caa-875b-a4bf2381e9c9.png">

赤く丸ボタンがついたら、左上のメニューから、虫マークのデバッグボタンを押します。

<img width="391" alt="スクリーンショット 2018-06-05 12.30.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/161088/a989b3e3-5c9c-88ff-81ae-fd4dd5e57ef0.png">



初めてデバッグする際には認証が必要です。
「許可が必要です」と出たら、「許可を確認」を選択。
次に、自分のメールアドレスを選択して、「許可」を選択。
※許可されない場合、警告画面の左下の詳細設定を押して、その中の「許可」を選択してください。

もう一度、虫マークのデバッグボタンを押します。

<img width="634" alt="スクリーンショット 2018-06-05 13.03.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/161088/6c89a7a2-1f8c-049e-f631-f0c211b97de4.png">

このように、データが取れていたら成功です。

あとは、デバッグボタンの左の実行ボタンを押せば、メールが送信されます。
<img width="66" alt="スクリーンショット 2018-06-05 13.26.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/161088/335404e1-b475-22b4-2d2c-5296e1e5cd37.png">

実行したら、スプレッドシートを確認してください。
送信回数が+1されていたら、成功です。

<img width="384" alt="スクリーンショット 2018-06-05 13.27.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/161088/6df2b82e-1920-081f-3f8d-1c356bfe6838.png">

以上。
何か、コードで間違っているところ、こうした方がいいよ、こんなやり方あるよとか、教えていただければ幸いです。

[サンプルSpreadSheets](https://docs.google.com/spreadsheets/d/1W_32X1ymj1oYFi0CcEnaXF9Hpw5oUTQ4zvO2t-Gdhyc/edit?usp=sharing)
[サンプルAppsScript](https://script.google.com/macros/d/MvoRfYhsICfabK2ajcONZsdSN0X1dlu9i/edit?uiv=2&mid=ACjPJvG_OXPqg0ALkwuFAhMq6H-r605eauKcqYxcXerAD3g4HImQCChogdTDNqVezCYilWs0MZj7-Pc-5hnIHT0Sr0-BNTXU3XBl_PvB_AUtlBni8I6iHFiOwchut3e7KItTTXPtEQgK05LI)