Googleフォームを使った出欠席確認と自動返信、その後の連絡方法まとめ


## はじめに

GoogleフォームとGoogle App Scriptの組み合わせによる出席確認メールの自動返信のスクリプトは大量に出回っているけど、実はそこから、出席者に追加で情報を送る必要が出てきたりなどそれだけでは不十分な場合はある。ほとんど、使い回しだけど、ここで一通りまとめておく。

## フォーム入力に対する確認メールの自動返信

フォームには、「御氏名」、「連絡先」、「連絡先（携帯メールアドレス）」の3つを入れてください。その後、ツールバーの「ツール」から「スクリプトエディタ…」を選択し、スクリプトエディタ画面を出す。その画面で、以下のsendmail.gsを作成する。

```sendmail.gs
function sendMail() {
  //------------------------------------------------------------
  // 設定エリアここから
  //------------------------------------------------------------

  // 件名、本文、フッター
  var subject = "ご登録ありがとうございます！";
  var body
  = "こんにちは\n\n"
  + "XXXフォームへのご登録ありがとうございます！\n"
  + "\n";

  var footer
  = "----\n"
  + "<<<署名>>>\n";

  // 入力カラム名の指定
  var NAME_COL_NAME = '御氏名'; // フォームに対応するカラム名を入れる
  var MAIL_COL_NAME = '連絡先（メールアドレス）'; // フォームに対応するカラム名を入れる
  var MAIL2_COL_NAME = '連絡先（携帯メールアドレス）';　// フォームに対応するカラム名を入れる
  var PARTICIPATION_COL_NAME = '御出欠席';　// フォームに対応するカラム名を入れる

  // メール送信先
  var admin = "<<< sending mail address >>>";
  var cc = ""; // Cc:
  var bcc = admin; // Bcc:
  var reply = admin; // Reply-To:
  var to = ""; // To: （入力者のアドレスが自動で入ります）
  var to2 = ""; // To: (メールアドレス２)

  //------------------------------------------------------------
  // 設定エリアここまで
  //------------------------------------------------------------

  try{
    // スプレッドシートの操作
    var sh = SpreadsheetApp.getActiveSheet();
    var rows = sh.getLastRow();
    var cols = sh.getLastColumn();
    var rg = sh.getDataRange();

    // メール件名・本文作成と送信先メールアドレス取得
    for (var j = 1; j <= cols; j++ ) {
      var col_name = rg.getCell(1, j).getValue(); // カラム名
      var col_value = rg.getCell(rows, j).getValue(); // 入力値
      if ( col_name === NAME_COL_NAME ) {
        body = col_value+" 様\n\n" + body;
      }

      if ( col_name === MAIL_COL_NAME ) {
        to = col_value;
      }

      if ( col_name === MAIL2_COL_NAME ) {
        to2 = col_value;
      }

      if ( col_name === PARTICIPATION_COL_NAME ) {
        body = body + "会への" + col_value + "確かに承りました。\n" + "ご回答ありがとうございます。\n\n"
      }
    }

    body += footer;

    // 送信先オプション
    var options = {};
    if ( cc ) options.cc = cc;
    if ( bcc ) options.bcc = bcc;
    if ( reply ) options.replyTo = reply;

    // メール送信
    if ( to ) {
      var addr = to;
      if ( to2 ) { addr = to + ',' + to2; }
      MailApp.sendEmail(addr, subject, body, options);
      Logger.log("send mail to " + addr);
    } else {
      MailApp.sendEmail(admin, "【失敗】Googleフォームにメールアドレスが指定されていません", body);
    }
  }catch(e){
    MailApp.sendEmail(admin, "【失敗】Googleフォームからメール送信中にエラーが発生", e.message);
  }
}
```

設定したら、スクリプトエディタ画面のツールバーで「リソース」から「すべてのトリガー」を選択し、トリガー設定画面でイベントの設定で「スプレッドシートから」、「フォーム送信時」を選択する。設定後、スプレッドシートにフォームから新規に入力があるたびにメールが返信される。

## 登録されたメールアドレスにメールを一括送信する

次に、一旦、登録されたメールアドレス群に一括して、メールを送信するスクリプトが以下になる。このスクリプトのonOpenを実行すると、スプレッドシートのツールバーにスクリプト実行というメニューが追加され、そのメニューから一括送信の作業ができるようになる。

このスクリプトの実行には、メールアドレスの一覧が載っているシートmembersに加え、別途メール本文とサブジェクトを書いたシートreminderを作成する必要があり、ここでの設定では、２行目、３列目にメールのサブジェクトが、4行目，3列目に本文が編集されている必要がある。

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

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

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

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

  //------------- （２）メール本文の情報を取得 -----------------------
  // メール本文シートを取得
  var mailForm = book.getSheetByName("reminder");

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

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

  //------------- （３）メール送信処理 -----------------------
  for (var i = 2;i <= numRows;i++) {
    // 出席の有無を確認。欠席だったら、スキップ
    var participation = membersList.getRange(i, 6).getValue();
    var name = membersList.getRange(i, 2).getValue();
    
    if (participation != "ご出席") {
      Logger.log("skipping " + name);
      continue;
    }
    // 対象行の差込データを取得
    var name = membersList.getRange(i, 2).getValue();
    var buf = body;

    if (name != "") {
      buf = buf.replace("{{name}}", name, "g");
    }

    // 対象行の宛先を取得
    var to = membersList.getRange(i, 9).getValue();
    MailApp.sendEmail(to, subject, buf);
  }

  // 終了確認ダイアログを表示
  Browser.msgBox("確認", "リマインダ一括が完了しました。", Browser.Buttons.OK);
};

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

## デバッグ＆ログ出力

デバッグのために、ログの出力を出したい時がある。その場合は、Loggerクラスを使う

```
Logger.log('hogehoge');
```

スクリプトエディタのメニューから「表示」⇨「ログ」を選ぶと出力されたログを読むことができる。