GoogleスプレッドシートとCustomers Mail Cloudで実現する大量メール配信

メールマガジンや顧客への案内メールなど、メールを大量配信したいという場面は多いです。しっかりとしたシステムを組んであるならそれを使えばいいですが、個人の担当者レベルで配信したいとなると手作業で行っている人も多いでしょう。

しかし手作業でのメール配信はミスも発生しやすいものです。そこでGoogleスプレッドシートとCustomers Mail Cloudを使って多数のメールにも耐えられる配信システムを構築してみます。

必要なシート

Googleスプレッドシートで以下のシートを用意します。

  • Dataシート
    • Customers Mail CloudのAPIキーや送信元アドレス、件名などの固定値を管理しているシートです
  • Listシート
    • 会社名や名前、メールアドレスなどを一覧で管理しているシートです
    • シート名は自由です

f:id:moongift:20191226101707p:plain
Dataシートの内容

スクリプトを用意する

まず、メール本文を作ります。同じ文面で送っても効果が限定的になりますので、会社名や個人名などを変換しながら送ってみます。そのため、スクリプトで次のような関数を定義します。

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としてください。

f:id:moongift:20191226101811p:plain
トリガー設定

ライブラリを読み込む

Google Apps Scriptでライブラリを読み込みます。これはリソースメニューのライブラリから行います。ライブラリのIDとして、1RegQzjZLiJUacopzEoxmpTe5_vp7LP3r01aa-D9rf4sJRPZkifI4Mf7K を入力してください。

f:id:moongift:20191226101843p:plain
ライブラリ追加

コードを記述する

次にスクリプトで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;
}

f:id:moongift:20191226101924p:plain
メール送信確認

これでメール送信まで行えるようになります。

f:id:moongift:20191226101949p:plain
メール送信中

まとめ

Google Apps Scriptにはメール送信関数が用意されていますが、メール送信可能数は制限があったり、送信元はGoogle Driveにログインしたアカウントに紐付きます。大量のメール配信には向かないでしょう。

Customers Mail Cloudを使ったメール配信はライブラリを使うことで簡単に行えます。ぜひご利用ください。

クラウドからのメール送信を簡単に。確実に。| Customers Mail Cloud