無題のプレゼンテーション

GASで差し込みメール配信する

情シス/コーポレートITの業務の中で、個々のアカウント通知メールなどを一括で配信したい場面が度々出てきます。
手動での個別メール送信はオペレーションミスの原因にもなるので、Googleドキュメント&スプレッドシートで差し込みメール配信を行うGASを用意しておくと非常に便利です。

前置き

・本スクリプトは、メルマガ配信など社外への大量配信を目的にしたものではなく、同組織内でのメール通知を目的としています。対外的なメール配信については、然るべき信頼性の高い仕組みを利用してください。

Gmailには1日あたりの送信数に制限がありますので、あまりに大量のメール送信は実施しないように注意してください。

1.テンプレートドキュメントを用意する

Googleドキュメントで、通知メールのテンプレートを作成しておきます。
変数となる箇所を{VALUE#}と記載しておきます。(今回は3つにしました)

2.スプレッドシートを作成する

一括配信の参照元のリストとなる、以下の画像のようなスプレッドシートを作成します。

[ドキュメントID]には、先の手順で用意しておいたGoogleドキュメントのファイルIDをセットします。
ファイルIDは、そのファイルを開いた際のURLのうち、以下の「XXXXXXXX」にあたるランダム文字列を指します。
https://drive.google.com/a/jmty.jp/file/d/XXXXXXXX/

[添付ファイルID]は、配信メールにファイルを添付したい場合のみセットしてください。あらかじめ添付したいファイルをGoogleドライブ上に配置しておき、そのファイルのIDをセットします。(IDの調べ方は上記と同じです)
PDFなど、ブラウザで直接開けないGoogleドライブ上のファイルのURLは、対象のファイルの[共有]メニューから共有リンクのURLを表示すれば確認することができます。

3.スクリプトを作成する

先の手順で作成したスプレッドシートに、以下のスクリプトを追加します。
※スプレッドシートのレイアウトをカスタマイズしている場合は、開始行数やカラム指定位置は適宜修正してください

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

//実行メニューを作成
function onOpen() {
 var ui = SpreadsheetApp.getUi();
 var menu = ui.createMenu("GAS実行");
 menu.addItem("メール送信実行", "sendMergeEmail");
 menu.addToUi();
}

function sendMergeEmail(){
 var lastColum = sheet.getLastColumn();
 var lastRow = sheet.getLastRow();
 var startRow = 6;
 var numRows = lastRow - startRow + 1;
 
 var dataRange = sheet.getRange(startRow, 1, numRows, lastColum);
 var data = dataRange.getValues();

 var strFrom = sheet.getRange(1,2).getValue();
 
 var docID = sheet.getRange(2,2).getValue();
 var attachementID = sheet.getRange(3,2).getValue();

 //テンプレートテキストの取得  
 var docTemplate = DocumentApp.openById(docID);
 var strTemplate = docTemplate.getBody().getText();
 
 for (var i = 0; i < data.length; ++i) {
   var row = data[i];
   
   row.rowNumber = i + startRow;
   
   //Result列がブランクであれば処理を実行    
   if (!row[7]) { 
     var result = "";
     
     try
     {
       var strVal1 = row[4];
       var strVal2 = row[5];
       var strVal3 = row[6];
       
       //テンプレートテキスト内の変数を置換
       var strBody = strTemplate.replace("\{VALUE1\}",strVal1).replace("\{VALUE2\}",strVal2).replace("\{VALUE3\}",strVal3); 
       
       var strTo = row[0]
       var strCc = row[1]
       var strBcc = row[2]
       var strSubject = row[3]
       
       var options = {};
       options.cc = strCc;
       options.bcc = strBcc;
       options.from = strFrom;
     
       //添付ファイル指定がある場合はoptionsに追加
       if(attachementID){
         var attachment = DriveApp.getFileById(attachementID);
         options.attachments = attachment
       }
       
       //メール送信実行       
       GmailApp.sendEmail(strTo,strSubject,strBody,options);
       
       result = "Success"; 
     }catch(e){
       result = "Error:" + e;
     }
     
     //実行結果をResult列にセット
     sheet.getRange(row.rowNumber, lastColum).setValue(result); 
   }
 }  
}

スクリプトの中で、テンプレート中の変数(今回の例だと{VALUE1~3})をスプレッドシートでセットされた値に置換しています。
変数名は何でもいいですが、テンプレート文中で同じ文字列が出てくるとそちらも置換されてしまうので、通常出てこないような文字列がいいでしょう。

4.実行する

作成したスクリプトを実行します。
スクリプトを実行すると実際にメールが送信されてしまうので、Toに自身のアドレスをセットして、必ず最初にテストを実施しておきましょう
スプレッドシートに記載されている内容に従い、以下のようにメールが配信されていきます。


補足

今回のスクリプトはプレーンテキストでのメール配信ですが、HTMLメール配信用のオプションも用意されているので、HTMLメールを配信したい方はこちらのGASリファレンスを参考にしてみてください。

この記事が気に入ったらサポートをしてみませんか?