メールマガジンや顧客への案内メールなど、メールを大量配信したいという場面は多いです。しっかりとしたシステムを組んであるならそれを使えばいいですが、個人の担当者レベルで配信したいとなると手作業で行っている人も多いでしょう。
しかし手作業でのメール配信はミスも発生しやすいものです。そこでGoogleスプレッドシートとCustomers Mail Cloudを使って多数のメールにも耐えられる配信システムを構築してみます。
必要なシート
Googleスプレッドシートで以下のシートを用意します。
- Dataシート
- Customers Mail CloudのAPIキーや送信元アドレス、件名などの固定値を管理しているシートです
- Listシート
- 会社名や名前、メールアドレスなどを一覧で管理しているシートです
- シート名は自由です
スクリプトを用意する
まず、メール本文を作ります。同じ文面で送っても効果が限定的になりますので、会社名や個人名などを変換しながら送ってみます。そのため、スクリプトで次のような関数を定義します。
function template(cell) { // 現在のスプレッドシート var ss = SpreadsheetApp.getActiveSpreadsheet(); // 現在のシート var sheet = ss.getActiveSheet() // 現在の行数 var row = ss.getActiveCell().getRow(); // 一行目(置き換えるキーワード)の列数を取得 var lastCol1 = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn(); // 置き換えるキーワードを全部取得 var ary = sheet.getRange(1, 1, 1, lastCol1).getDisplayValues()[0]; // 置き換わる文字列を全部取得 var values = sheet.getRange(row, 1, row + 1, lastCol1).getDisplayValues()[0]; // 置き換え実行 for (var i in ary) { var r = new RegExp('%' + ary[i] + '%', 'g'); cell = cell.replace(r, values[i]); } return cell; }
この関数は %会社名%
のように %〜%
で囲まれた文字列を置き換える関数になります。メールの本文はDataシートの中に定義しておきます。関数はListシートの中で使います。関数を実行している行の横にある情報を使ってメールテンプレートを置き換えてくれます。
これで宛先ごとに文面を差し替えながらメール送信できます。
メール送信を行う
メール送信は sendMail
という関数で行うこととします。そこで、Listシート内に図形を挿入し、クリック時のイベントを設定します。トリガー名はsendMailとしてください。
ライブラリを読み込む
Google Apps Scriptでライブラリを読み込みます。これはリソースメニューのライブラリから行います。ライブラリのIDとして、1RegQzjZLiJUacopzEoxmpTe5_vp7LP3r01aa-D9rf4sJRPZkifI4Mf7K
を入力してください。
コードを記述する
次にスクリプトでsendMailを定義します。
function sendMail() { // この中に記述していきます }
以下のコードはsendMail内に記述します。まず、間違って押してしまったケースを想定して確認ダイアログを出します。キャンセルを押したら処理を終了します。
// 送信確認を行います。関数は下記参照。 if (!confirm("送信しますか?")) return;
次にスプレッドシートのシートを取得します。
// スプレッドシートオブジェクトを取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); // 送信先の一覧が書かれたシート var sheet = ss.getActiveSheet(); // 最終行を取得 var lastRow = sheet.getLastRow(); // 設定の書かれているシート var data = ss.getSheetByName("Data");
Dataシートの記述した内容に従ってCustomers Mail Cloudの初期化を行います。
// API情報を取得 var apiUser = data.getRange(1, 2).getValue(); var apiKey = data.getRange(2, 2).getValue(); // Customers Mail Cloudを初期化 var c = new CustomersMailCloud.Client(apiUser, apiKey);
APIのエンドポイントURLは契約によって異なるので注意してください。
// trialまたはstandard、proを実行
c.trial();
固定値になる送信元と件名をセットします。
// 送信元情報を取得、設定 var fromName = data.getRange(3, 2).getValue(); var fromAddress = data.getRange(4, 2).getValue(); c.setFrom(fromName, fromAddress); // 件名を取得 c.subject = data.getRange(5, 2).getValue();
後はメール送信先の一覧を上から順番に読み込んでメール送信を実行します。メール送信がうまくいってもエラーが出ても、5番目の列にステータスを表示します。
// リストを一行ごとに実行 for (var i = 2; i <= lastRow; i++) { // 本文を取得 c.text = sheet.getRange(i, 4).getValue(); // 送信先を取得、設定 var toName = sheet.getRange(i, 2).getValue(); var toAddress = sheet.getRange(i, 3).getValue(); c.addTo(toName, toAddress); try { // 送信処理を実行 c.send(); // 送信できたらセルを更新 sheet.getRange(i, 5).setValue("送信完了"); // 送信先情報をリセット c.to = []; } catch (e) { // エラーの場合は原因を表示 sheet.getRange(i, 5).setValue(e); } }
一番最初に行った確認用関数 confirm は標準関数ではないので、以下の関数を定義します。
// 確認ダイアログを表示する関数 function confirm(msg){ var res = Browser.msgBox(msg, Browser.Buttons.OK_CANCEL); return res === "ok" ? true : false; }
これでメール送信まで行えるようになります。
まとめ
Google Apps Scriptにはメール送信関数が用意されていますが、メール送信可能数は制限があったり、送信元はGoogle Driveにログインしたアカウントに紐付きます。大量のメール配信には向かないでしょう。
Customers Mail Cloudを使ったメール配信はライブラリを使うことで簡単に行えます。ぜひご利用ください。