見出し画像

SpreadsheetとGASとGMailでメール本文を送信先毎に変更する話。

お疲れ様です。
ライフマップ開発チームの大城です。
本日は、前回作成したメール送信機能に、送信先毎にメール本文を変更する機能を追加しようと思います。

↓↓↓前回の記事はこちら↓↓↓

この記事では、以下の4つを行いたいと思います。

  • Spreadsheetに送信先毎のデータを追加する

  • Spreadsheetのメール本文を修正する

  • GASでメール本文を送信先毎のデータで置換する

  • GASからメールを送信する

先に完成したものを載せておきます。

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet       = spreadsheet.getSheetByName('メール内容');

  // メール内容の取得
  var from_name = sheet.getRange(2, 2).getValue();
  var subject   = sheet.getRange(3, 2).getValue();
  var body_text_template = sheet.getRange(4, 2).getValue();

  // 送信先リストの取得
  var sheet = spreadsheet.getSheetByName('送信先リスト');
  var list  = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues();
  var list_headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];

  // メール送信
  for (var i = 0; i < list.length; i++) {
    var to_email = list[i][0];
    var options = {}
    options['name'] = from_name;

    // メール本文の作成
    var body_text = body_text_template;

    for (var j = 0; j < list_headers.length; j++) {
      var header = list_headers[j];
      var value = list[i][j];
      var regexp = new RegExp("%%" + header + "%%", "g");
      body_text = body_text.replace(regexp, value);
    }
    
    GmailApp.sendEmail(to_email, subject, body_text, options);
  }
}

Spreadsheetに送信先毎のデータを追加する

シートを修正する

2枚目のシート『送信先リスト』にデータを追加します。
B列『last_name』とC列『first_name』を、A列『email』の横に追加してください。

シート『送信先リスト』の内容

Spreadsheetのメール本文を修正する

シートを修正する

1枚目のシート『メール内容』の本文を修正します。
今回は『〇〇様』を追加したいので、本文の頭に『%%last_name%% %%first_name%% 様』を加えます。

シート『メール内容』の内容

先ほどシート『送信先リスト』に追加したヘッダー名(last_nameやfirst_name)と揃えることが重要です。

GASでメール本文を送信先毎のデータで置換する

メール本文を取得する

前回はシート『メール内容』の本文をそのまま使用しましたが、今回は送信先毎に本文を変える必要がある為、シート『メール内容』の本文をベースに新しく本文を作成します。

まずは本文を取得します。

  // メール内容の取得
  var from_name = sheet.getRange(2, 2).getValue();
  var subject   = sheet.getRange(3, 2).getValue();
  var body_text_template = sheet.getRange(4, 2).getValue();

※ 変数名を body_text から body_text_template に変更しています。

送信先毎のデータを取得する

次に送信先毎のデータを取得しましょう。
といっても、実は既に取得できているので、今回はデータのヘッダーの取得だけでOKです。

  // 送信先リストの取得
  var sheet = spreadsheet.getSheetByName('送信先リスト');
  var list  = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues();
  var list_headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];

※ list_headers を追加しています。

sheet.getRange で、シート『送信先リスト』の1行目1列目から1行最終列までのセル範囲を指定し、 getValues で値を取得しています。
getValues の返り値は多次元配列なので、 [0] で最初の1行を取得しています。

多次元配列とは、プログラミング言語などが扱うデータ構造の一つで、配列の各要素が配列に、その要素がさらに配列になっているような入れ子構造の配列のこと。

多次元配列とは - 意味をわかりやすく - IT用語辞典 e-Words

メール本文を作成する

取得したメール本文のベースとデータを使って、メール本文を作成しましょう。

  // メール送信
  for (var i = 0; i < list.length; i++) {
    var to_email = list[i][0];
    var options = {}
    options['name'] = from_name;

    // メール本文の作成
    var body_text = body_text_template;

    for (var j = 0; j < list_headers.length; j++) {
      var header = list_headers[j];
      var value = list[i][j];
      var regexp = new RegExp("%%" + header + "%%", "g");
      body_text = body_text.replace(regexp, value);
    }
    
    GmailApp.sendEmail(to_email, subject, body_text, options);
  }

※ メール送信処理に、『メール本文の作成』処理を追加しています。

まずメール本文にベースをコピーします。
body_text に body_text_template を代入するだけでOKです。

次に、メール本文にある %%{ヘッダー名}%% のようなテキストを宛先毎のデータに置き換えます。
for文を使って、ヘッダー毎にテキストを置換していきましょう。
処理の動きは以下の通りです。

  1. ヘッダー名を取得

  2. ヘッダーに紐づく宛先毎のデータを取得

  3. new RegExp でヘッダー名を使って正規表現を作成

  4. replace でメール本文から正規表現で検索し、宛先毎のデータに置換

GASからメールを送信する

メールを送信する

ここまで完了したら、早速試してみましょう。
GASを保存して、作成した関数(myFunction)を選択し、実行ボタンを押してください。
『承認が必要です』と警告が表示された場合、全て許可してください。
※ 特に問題はないと思いますが、トラブル等発生した場合は責任を負いかねますのであらかじめご了承ください。

メールを確認する

メール送信の実行が完了したら、メールが届いているか確認してください。
宛先毎にメール本文の『%%last_name %%first_name%% 様』が『〇〇 様』に置き換わっていれば成功です。

お疲れ様でした!

最後に

メール毎に本文を書き換えられると便利ですよね。
今回は名前だけでしたが、宛先毎に会社名や部署名、挨拶や締めの言葉などいろいろな事に使えるので是非試してみてください。
次回は、スプレッドシートからGASのスクリプトを実行する方法を記事に書きたいと思います。

ではまた次回、大城でした!