Google Formでセミナー申込フォームをつくった時のメモ

Google FormとGASでセミナー申込からメール自動送信までを作った時のメモです。

# ざっくりとした手順
1. Google Formで申込フォームを作成
1. 確認メッセージ用の文章をGoogle Documentに作成（詳細後述）
1. 確認メッセージを書き換えるスクリプトの作成と実行
1. 返信メール用のテンプレートをGoogle Documentに作成
1. 回答用スプレッドシートにメール自動送信スクリプトを作成
1. 自動送信スクリプトにトリガーを設定
## Google Formで申込フォームを作成
細かな手順は省略。
* 電話番号のValidationに使った正規表現
`^(0{1}\d{1,4}-{0,1}\d{1,4}-{0,1}\d{4})$`


今回の要件に合わせて設定を一部変更
1. [回答]-[メールアドレスを収集する]→収集しない
1. [プレゼンテーション]-[別の回答を送信するためのリンクを表示]→OFF

確認メッセージの変更は次の手順で
## 確認メッセージ用の文章をGoogle Documentに作成
設定画面からの確認メッセージの変更は改行が入れられないので、体裁の良い文章をDocumentに作成しておく。

``` plaintext
この度は、弊社開催の「〇〇セミナー」に
お申し込みいただき、誠にありがとうございます。

メールアドレスを入力頂いた場合は申込完了メールをお送りしておりますので、ご確認ください。

★★★セミナーについて★★★
【日時】2099年99月99日(日) 00時00分～99時99分　（開場11時11分）
【場所】〇〇〇〇〇〇〇〇〇〇
【会場ホームページ】 http://example.com/

★★★キャンセルについて★★★
キャンセルされる場合は、〇〇セミナー事務局までご連絡をお願いいたします。

★★★お問い合わせ先★★★
〇〇セミナー事務局 　担当：〇〇
メール：info@example.com
電話番号：000-0000-0000　＜平日：9時～17時＞

では、当日会場にて
お会いできるのを楽しみにしております。

〇〇セミナーに関して、ご質問等ございましたら
お気軽に事務局までご連絡下さいませ。
```


## 確認メッセージを書き換えるスクリプトの作成と実行
**Formのスクリプトエディタから**次のコードを追加して実行する。一度実行するだけでOK。

``` JavaScript:コード.gs
function setConfMsg() {
  const form = FormApp.getActiveForm();
  let doc = DocumentApp.openById('確認メッセージ用のドキュメントID');
  let txt = doc.getBody().getText();
  form.setConfirmationMessage(txt)
}
```


実行するとアクセス承認のダイアログが表示されるので承認する。実行後Formの設定画面で[プレゼンテーション]-[確認メッセージ]が書き換わっていることを確認する。**元のDocumentを変更しても連携して変わる訳ではないのでスクリプトは残しておく。**

### 参考
[ドキュメントIDについて（公式ドキュメント）](https://developers.google.com/docs/api/how-tos/overview?hl=ja#document_id)
[【GAS】Google Apps Scriptをアカウントに承認させる方法](https://tatsuya-note.com/how-to-get-gas-approved-account/)

## 返信メール用のテンプレートをGoogle Documentに作成
返信メールの内容が長文になるので、自動送信する返信メールをDocumentに作成しておく。短いメッセージならスクリプト直書きでもよい。
``` plaintext
※このメールはシステムからの自動返信です

[お名前]様

お世話になっております。
〇〇セミナー事務局でございます。

この度は、弊社開催の「〇〇セミナー」に
お申し込みいただき、誠にありがとうございます。

以下の内容で参加をお受けいたしましたので、ご確認ください。

お名前：[お名前]
電話番号：[電話番号]
メールアドレス：[メールアドレス]
受付日時：[受付日時]

★★★セミナーについて★★★
【日時】2099年99月99日(日) 00時00分～99時99分　（開場11時11分）
【場所】〇〇〇〇〇〇〇〇〇〇
【会場ホームページ】 http://example.com/

★★★キャンセルについて★★★
キャンセルされる場合は、〇〇セミナー事務局までご連絡をお願いいたします。

★★★お問い合わせ先★★★
〇〇セミナー事務局 　担当：〇〇
メール：info@example.com
電話番号：000-0000-0000　＜平日：9時～17時＞

では、当日会場にて
お会いできるのを楽しみにしております。

〇〇セミナーに関して、ご質問等ございましたら
お気軽に事務局までご連絡下さいませ。
```
## 回答用スプレッドシートにメール自動送信スクリプトを作成
Form作成画面の回答タブから[スプレッドシートにリンク]で結果を記録するスプレッドを作成する。
**スプレッドシートのスクリプトエディタ**から自動送信スクリプトを作成する

```javascript:onFormSubmit.gs
function onFormSubmit(e) {
  let doc = DocumentApp.openById('返信メール用のテンプレートのドキュメントID');
  let txt = doc.getBody().getText();

  let TimeStamp = e.namedValues["タイムスタンプ"][0];
  let Name = e.namedValues["お名前"][0];
  let telno = e.namedValues["電話番号"][0];
  let Email = e.namedValues["メールアドレス"][0];
  let comment = e.namedValues["ご意見"][0];
  let Subject = "【申込受付】" + Name + " 様 申込を受け付けました";
  txt = txt.replace(/\[お名前\]/g,Name);
  txt = txt.replace(/\[電話番号\]/g,telno);
  txt = txt.replace(/\[メールアドレス\]/g,Email);
  txt = txt.replace(/\[ご意見\]/g,comment);
  txt = txt.replace(/\[受付日時\]/g,TimeStamp);

  let Body = txt;
  if (Email != "") {
    GmailApp.sendEmail(Email, Subject, Body);
    console.log("申込完了メールを送信しました");
  } else {
    console.log("メールアドレスが省略されました");
  }
}
```
* e.namedValuesのインデックスはFormで定義した項目名
* 中盤のtxt.replaceでDocumentから取得したテキストの可変部分を置換
* 今回の案件ではメールアドレスが必須ではなかったのsendEmailメソッド手前で分岐している

## 回答用スプレッドシートにメール自動送信スクリプトの作成とトリガーの設定
スクリプトにトリガーを設定する
* [イベントのソース]→スプレッドシートから
* [イベントの種類]→フォーム送信時

トリガー作成時にアクセス承認のダイアログが表示されるので承認する。

# 受付終了時のオペレーション
Form作成画面で[回答]タブの先頭で[回答を受付中]をオフにしてメッセージを書く