意外に手間がかかるメールの一斉送信

企業にとって重要な連絡手段となっているのがメールだが、パートナー企業やユーザーに対して一斉にメール送信したい場合があるだろう。もちろん、宛先の数が少数であれば「To」や「Cc」あるいは「Bcc」欄に入力して、メール本文の定型文を用意し、個別に送ってもよい。

しかし、一斉送信の宛先数が多くなると入力作業だけでも大仕事。すべてのメールアドレス宛にひとつずつ送信していたのでは時間がいくらあっても足りない。

また、返信先に応じて本文中に相手先の名前やユーザーIDなどを入れたいようなケースもあるだろうし、キャンペーン応募者に対する返信などでは宛先が毎回変わる上に、ある程度の即時返信も求められる。

そこで便利なのが、Googleドキュメントのスプレッドシートへ入力したメールアドレスに対して、自動的にメールを送信してくれるスクリプト。今回は、Google Apps Scriptを使ったメールの送信の簡単な例を紹介する。

送信作業の効率化に加えてミスの抑制も

Google Apps Scriptは、スクリプトの内容しだいでさまざまなことを行えるのが特徴。今回用意したスクリプトも、単純にスプレッドシート内のメールアドレスを取得して自動送信するだけでなく、送信相手の名前や担当者の名前などを個別に記載することが可能だ。

確かに、スプレッドシートへメールアドレスを入力、またはコピー&ペーストする際に発生する人的要因のミスは気になるところだが、この点についてはいくつかの解決方法がある。たとえばサイトのアンケートからダイレクトにスプレッドシートへ記載するようなスクリプトも有効だし、回答内容をスプレッドシートに自動集計してくれるGoogleドライブのフォーム機能を活用すればさらに簡単だ。

メールアドレス一覧さえあれば、スプレッドシートをスクリプトに合うよう加工、もしくはスクリプトをスプレッドシートに合わせて書き換えるだけで、メール送信関連の作業を大幅に迅速化できるほか、人的要因のミスを抑制することにもつながる。

基本データはスプレッドシートで管理

それでは改めて、今回のスクリプトを見ていこう。なお、本連載はあくまでもGoogle Apps Scriptの利便性を体感してもらうのが主目的。実際に使用するシーンでは、送信ミスなどがおこらないようにより厳密な処理や作業手順が必要となるだろうが、ここではあえて簡易な内容としている。

スクリプトは記事末尾に掲載しているので、連載1回目を参照し、スプレッドシートを新たに作成してスクリプトエディタを開き、コピー&ペーストして利用できる。

基本となるスプレッドシートには、「宛先リスト」と「メール本文」という2種類のシートを作成。

宛先リストには「To/Cc/Bcc」のほか、「配信状態」「差込データ1」「差込データ2」「差込データ3」という項目がある。配信状態は、メールが送られたかを確認するための項目。メール送信後に「配信済」と自動入力されるので、初期状態では空欄となっている。

「宛先リスト」シートに宛先や差込データの内容を入力

次の差込データには、メール本文に対して個別に自動入力する内容を入れておく項目。メール本文のシートを見てみると分かるが、今回のスクリプトでは「差込データ1が相手先の名前」「差込データ2が担当者の名前」「差込データ3が申込期限」を指定している。

「メール本文」シートに件名や本文のひな形を用意

各項目の上部にある「処理開始行番号」については、どの行からメール送信を始めるか指定するためのもの。初期状態の「3」なら3行目(宛先表の中では1行目となる)、つまり一番上のデータからメール送信を行い、この値を「4」にすれば1行目のデータを飛ばして4行目からメール送信が実行される。

メール本文のシートに関しては、メールの件名と本文をそのまま記載するだけでよい。前述の通り、差込データは本文の内容に応じて変更可能だ。

スクリプトの実行をメニューからも可能に

ここで、スクリプトの中身についても触れておきたいと思う(スクリプトは記事末尾に掲載)。

コード画面は、「ツール」メニューの「スクリプトエディタ」で表示できる

まず5~16行目では、スプレッドシートの宛先リストから処理対象となる行数の取得を行っている。取得するシート名を変えたい場合は10行目の「"宛先リスト"」部分を変更すれば良い。

続いて、18~29行目で行っているのがメール本文の情報取得だ。メール本文のシートを参照し、23行目の「(2, 3)」で「C2」の件名、26行目の「(4, 3)」で「C4」の本文を取得。29行目では、宛先リストシートにある処理開始番号を取得している。

31行目からは、メール送信処理だ。32~39行目で差込データの取得、41~57行目で差込処理を実施。59~64行目で宛先となるTo/Cc/Bccの取得およびメール送信、66~67行目で次に処理する行番号を設定、69~70行目で配信状態の変更を行っている。

以降は終了確認ダイアログの表示や処理開始行番号の初期化など、スクリプトの全体動作に関する処理だ。

このスクリプトは、コントロールメニューにスクリプトを実行するメニュー「メール一斉送信」を追加する処理も行なっており、上部メニューの「スクリプト実行」から実行することができる。誰でも簡単に試せるので、ぜひ一度トライしていただきたい。なお、実際にメールが送信されるので宛先には注意してほしい。

ドキュメントを開くと、メニューにスクリプトを実行する項目を自動的に追加するようにしている

次回は、今回のスクリプトをさらに進化させ、Googleドライブのファイルを添付して送信する例を紹介する。

/**
 * メール一括送信処理の定義
 */
function sendMail() {
  //------------- (1)宛先リストから処理対象の行数を取得 -----------------------
  // スプレッドシート(MS Excelで言う所のブック)を取得
  var book = SpreadsheetApp.getActiveSpreadsheet();

  // 宛先リストシートを取得
  var sheetAtesakiList = book.getSheetByName("宛先リスト");

  // データが入力されている範囲を取得
  var datRange = sheetAtesakiList.getDataRange();

  // 処理対象の行数を取得
  var numRows = datRange.getNumRows();  

  //------------- (2)メール本文の情報を取得 -----------------------
  // メール本文シートを取得
  var sheetMailHonbun = book.getSheetByName("メール本文");

  // メール件名を取得
  var subject = sheetMailHonbun.getRange(2, 3).getValue();

  // メール本文を取得
  var body = sheetMailHonbun.getRange(4, 3).getValue();

  // 処理を開始する行番号を取得
  var start = sheetAtesakiList.getRange(1, 5).getValue();

  //------------- (3)メール送信処理 -----------------------
  for (var i = start;i <= numRows;i++) {
    // 対象行の差込データを取得
    var sasikomiData1 = sheetAtesakiList.getRange(i, 6).getValue();
    var sasikomiData2 = sheetAtesakiList.getRange(i, 7).getValue();
    var sasikomiData3 = sheetAtesakiList.getRange(i, 8).getValue();

    var sasikomiGoSubject = subject;
    var sasikomiGoBody = body;

    // 差込データ1が入力されている場合は、差込処理を行う(件名+本文)
    if (sasikomiData1 != "") {
      sasikomiGoSubject = sasikomiGoSubject.replace("{{差込データ1}}", sasikomiData1, "g");
      sasikomiGoBody = sasikomiGoBody.replace("{{差込データ1}}", sasikomiData1, "g");
    }

    // 差込データ2が入力されている場合は、差込処理を行う
    if (sasikomiData2 != "") {
      sasikomiGoSubject = sasikomiGoSubject.replace("{{差込データ2}}", sasikomiData2, "g");
      sasikomiGoBody = sasikomiGoBody.replace("{{差込データ2}}", sasikomiData2, "g");
    }

    // 差込データ3が入力されている場合は、差込処理を行う
    if (sasikomiData3 != "") {
      sasikomiGoSubject = sasikomiGoSubject.replace("{{差込データ3}}", sasikomiData3, "g");
      sasikomiGoBody = sasikomiGoBody.replace("{{差込データ3}}", sasikomiData3, "g");
    }

    // 対象行の宛先を取得
    var to = sheetAtesakiList.getRange(i, 2).getValue();
    var cc = sheetAtesakiList.getRange(i, 3).getValue();
    var bcc = sheetAtesakiList.getRange(i, 4).getValue();

    MailApp.sendEmail(to, sasikomiGoSubject, sasikomiGoBody, {cc:cc, bcc:bcc});

    // 処理を開始する行番号を設定(次回実行時には次の行から開始するようにする)
    sheetAtesakiList.getRange(1, 5).setValue(i + 1);

    // 配信状態を設定
    sheetAtesakiList.getRange(i, 5).setValue("配信済");
  }

  // 終了確認ダイアログを表示
  Browser.msgBox("確認", "メール一斉送信が完了しました。", Browser.Buttons.OK);

  // 処理を開始する行番号を初期化
  sheetAtesakiList.getRange(1, 5).setValue(3);

};

/**
 * スプレッドシート(MS Excelで言う所のブック)を開いた時に実行する処理。
 * スプレッドシートを開いた際に、以下の処理(関数)が自動実行される。
 * ここではコントロールメニューにスクリプト実行コマンドを追加している。
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    {
      name : "メール一斉送信",
      functionName : "sendMail"
    }
  ];
  sheet.addMenu("スクリプト実行", entries);
};