Googleフォームでメールアドレス事前入力済みのフォームを自動送信で送る

背景

Googleフォームを参加登録などに利用していて遭遇するトラブルの1つは,入力してもらったメールアドレスが間違っていることやパソコンメールが受け取れないアドレスでの登録です。こちらから連絡ができずにどうしようもない状態になる場合もあります。

このような事態を防ぐためには,メールアドレスを2回入力してもらうという方法や仮登録としてメールアドレスを入力してもらい,仮登録したメールメールアドレスに本登録フォームを送るという方法があります。パソコンメールを受け取れないメールアドレスへの対応を考えると後者の方が良いため,後者をGoogleフォームとGoogle app scriptで実装してみます。

実装例

以下のようなフローを想定しています。なお,申し訳ないのですが,ある程度,Google app scriptの知識をお持ちな方を対象としているため,「トリガー」などの説明は省略させていただきます。

  • 参加者は仮登録フォームからメールアドレスを入力し申込み
  • メールアドレス欄に仮登録されたメールアドレスが既に入力された本登録フォームを用意
  • 仮登録されたメールアドレスに,上記の本登録フォームのURLを含むメールを自動送信

まず,仮登録フォームと本登録フォームを用意します。

仮登録フォームの作成

仮登録フォームはメールアドレスを収集するだけで良いので,シンプルにメールアドレスを聞く項目だけにしておきます。ついで,仮登録フォームの回答を記録するGoogleスプレッドシートを作成します。このシートは,仮登録フォームの「回答」タブの右上の緑色のボタンから作成できます(下図)。

f:id:cognition:20190620110246p:plain

仮登録フォームを記録するスプレッドシートのIDもメモしておきます。以下の□の部分です。

https://docs.google.com/spreadsheets/d/□□□□□□□□□□□□□□□□□□□□□□□□/

本登録フォームの作成

次に,本登録フォームを作成します。本登録フォームの形式はそれぞれ独自のものになるかと思いますが,フォームの項目にメールアドレスを入力する欄を作成しておきます。ここが重要ですが,Googleフォームの設定で自動的に作られるメールアドレス欄ではなく,自分で「記述式」項目としてメールアドレスを入力するようにしておきます。「記述式」の質問を作成し,「回答の検証」から「テキスト」と「メールアドレス」と設定しておくと良いでしょう。

f:id:cognition:20190620110605p:plain

次に本登録フォームの右上の3点リーダーをクリックして,「事前入力したURLを取得」を選び,メールアドレスの項目に適当なメールアドレスを入力します。そして,リンクの取得を選びます。

f:id:cognition:20190620110857p:plain

そうすると,メールアドレスの項目に先ほど入力したアドレスが事前入力された状態の本登録フォームのURLがコピーされます。このURLにはQueryパラメータとして,事前に項目に入力される内容が含まれています(&entry〜)。以下のような感じです(○○○○○はGoogleフォームのIDです)。

https://docs.google.com/forms/d/e/○○○○○○○○○○○○○○○○○○○○○○○○○/viewform?usp=pp_url&entry.743877729=abc@abc.com

このURLのメールアドレス部分を仮登録フォームで送信されたメールアドレスに変更し,変更したURLを自動送信すれば目標の達成となります。

Google app scriptの作成

これを踏まえて,仮登録フォーム(Googleフォームの方)のスクリプトエディタを開き,以下のようなGoogle app scriptを書きます。

function sendForm(){ 
  var sheet = SpreadsheetApp.openById('□□□□□□□□□□□□□□□□□□□□□□□□'); //このフォームの回答を記録するスプレッドシートのID
  var regiSheet = sheet.getSheetByName("フォームの回答 1") //登録情報のシートの読み込み 
  var lastRow = regiSheet.getDataRange().getLastRow(); //記録の最終行を取得
  var mailAdress = regiSheet.getRange(lastRow,3).getValue(); //メールアドレス
  var formID = "○○○○○○○○○○○○○○○○○○○○○○○○○"; //本登録フォームのID
  var preFillEntry = "entry.743877729="; //本登録フォームの事前入力済みしたい項目名(=までを入力)
  var formURL = "https://docs.google.com/forms/d/e/"+ formID + "/viewform?usp=pp_url&" + preFillEntry + mailAdress;

  var mailTo = mailAdress;
  var mailSubject = "本登録フォームをお送りします"; //メールの件名
  var senderAdress = "差出人のメールアドレス"; //差出人のメールアドレス
  var senderName = "差出人名"; //差出人名
  var bodyText =  "研究に参加いだたいている方へ\n\n以下のURLをクリックし,本登録をお願いいたします。\n"+formURL; //メール本文

  MailApp.sendEmail(mailAdress, mailSubject, bodyText); //メール送信
}

最後に仮登録フォームのトリガーとして,「フォーム送信時」に上記のsendFormを実行するように設定すればOKです。 実際の運用では,申込前の説明や仮登録フォームの送信後などで,本登録用メールが届かない場合は別のメールアドレスなどで再度申込をするようアナウンスすることも必要でしょう。

注意点など

なお,このコードでは,メールの送信はGoogle app script(Gmail)で行っていますが,応募が多数行われる場合では送信数制限が厳しいため,sendGridなどを利用して送信した方がよいでしょう。また,複数人から同時申込に対するLock処理も入れた方がよいです。

参考

GoogleフォームにURLパラメータ使って初期値を指定する方法 | なかちょんブログ

https://mrunadon.github.io/%E7%B0%A1%E5%8D%984%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E7%B5%8C%E9%A8%93%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E8%87%AA%E5%8B%95%E8%AA%BF%E6%9F%BB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E6%A7%8B%E7%AF%89/