どうも。つじけ(tsujikenzo)です。このシリーズでは 「Googleフォームとイベントオブジェクトを極めよう」 について全6回でお送りします。今日は4回目です。
前回のおさらい
前回は、 「トリガーとイベントオブジェクト」 をお届けしました。 GASにおけるイベントハンドラーである、 シンプルトリガー と インストーラブルトリガー を見比べながら、最後は イベントオブジェクト を紹介しました。
今回は、 「スプレッドシートのコンテナバインドのフォーム送信時トリガー」 をお届けしします。
アジェンダ
1. スプレッドシートのコンテナバインドのフォーム送信時イベントオブジェクト
2. 多彩なスプレッドシート連携
3. フォーム送信時にメールを送信する(1対1)
4. フォーム送信時にメールを送信する(多対1)
5. トリガーの発火に条件を加える
スプレッドシートのコンテナバインドのフォーム送信時イベントオブジェクト
公式リファレンスによると、スプレッドシートのコンテナバインドのフォーム送信時に渡されるイベントオブジェクトには、下記の 5つのプロパティ が格納されています。
このイベントオブジェクトに格納されているプロパティを操作することで、さまざま業務効率化ツールを作成することができます。
ツールは主にGASで書きますが、まずは 多彩なスプレッドシート連携 をご紹介します。
多彩なスプレッドシート連携
第2回目のおさらいですが、フォームには、回答の集計として 新しいスプレッドシートを作成して連携 できました。
まだ、連携できていない方は、こちらの記事を参考に、フォームに 新しいスプレッドシート を連携してください。
このように、スプレッドシートに 「[フォームアイコン]フォームの回答1」 というシートが追加されていれば完了です。
既存のスプレッドシートに、フォームの集計シートを連携する
フォームは 「新しいスプレッドシートを作成」 して連携する以外にも、 「既存のスプレッドシート」 を連携することもできます。
今回は、このようなスプレッドシートを用意しました。
「パーティー招待状」 の回答を、このスプレッドシートに連携したいと思います。
フォームの編集画面から [回答] タブをクリックして、 [スプレッドシート] アイコンをクリックします。
[既存のスプレッドシートを選択] にチェックをいれて、 [選択] をクリックします。
Googleドライブが表示されますので、スプレッドシートを選択して [選択] をクリックします。
自動的にスプレッドシートが開きます。既存のスプレッドシートに 「フォームの回答1」 というシートが作成されています。
これでフォームと、既存のスプレッドシートが連携されました。
複数のフォームの集計を1つのスプレッドシートに連携する
既存のスプレッドシートに連携できるのは、1つのフォームだけではありません。 複数のフォームとスプレッドシートを連携 してみましょう。
今回は、テンプレートから 「Tシャツ申込書」 というフォームを新規作成しました。1つ回答を送信しておきましょう。
このフォームを、先ほどのスプレッドシートに連携します。
連携の手順はおなじです。フォームの編集画面から、 [回答] タブをクリックして、 [スプレッドシート] のアイコンをクリックします。
スプレッドシートを選択して [選択] をクリックします。
スプレッドシートが自動で開きます。 スプレッドシートには [フォームの回答2] というシートが追加されています。もちろん、前回連携した [フォームの回答1] シートもあります。
それぞれのフォームから回答を送信すると、それぞれのシートに反映されることを確認しましょう。
このように、集計の回答は 1(フォーム)対1(スプレッドシート) だけでなく、 多(フォーム)対1(スプレッドシート) の連携ができます。
多方面から送信される、 質問名が違う回答 を集計したい場合などに便利です。
フォーム送信時にメールを送信する(1対1)
フォームにはあらかじめ、 「回答のコピーをメールで送信する」 という機能があります。
しかしながら、メール本文にオリジナルメッセージを追加したい、CCを追加したいなど、メールをカスタマイズしたい場面も出てくると思います。
今回は、「フォームの回答が送信されたら、Gmailの下書きを作成する」 GASを書いてみましょう。まずは、 1(フォーム)対1(スプレッドシート) の連携をしている場合です。
スプレッドシートのコンテナバインドスクリプトを開き、GASを書きます。今回は、 「Tシャツ申込書フォーム」 が送信されたときを想定しています。
function onFormSubmit(e){
const [timeStamp, name, size, comment] = e.values;
const recipient = 'hoge@gmail.com';
const subject = 'フォームから回答です';
const body = `${name}さんから${size}の注文がありました。コメント:「${comment}」`;
GmailApp.createDraft(recipient, subject, body);
}
トリガーの設定
スクリプトエディターの左メニューから [トリガー] をクリックします。
トリガー設定画面が表示されたら、右下の [トリガーを追加] をクリックします。
トリガーの設定は以下の通りです。
1. 実行する関数を選択・・・onFormSubmit
2. イベントのソースを選択・・スプレッドシートから
3. イベントの種類を選択・・・フォーム送信時
最後に [保存] をクリックします。
トリガーが設定されました。
[Tシャツ申込書] フォームから、新たにダミー回答を送信してみましょう。
Gmailを開くと、 [下書き] に1件のメールが作成されています。
1(フォーム)対1(スプレッドシート) の連携は、比較的簡単に操作できます。問題は 多(フォーム)対1(スプレッドシート) の連携です。
フォーム送信時にメールを送信する(多対1)
お気付きの方もいらっしゃるかもしれませんが、それぞれのフォームに対応した 「スプレッドシートからフォーム送信時」 トリガーを設置した場合、どれか1つのフォームを送信すると すべてのトリガーが発火してしまいます。
「パーティー招待状が送信されたらメールの下書きをする関数」は、このようになっています。
function onPartyInvitationFormSubmit(e) {
const [timeStamp, name, ans, quantity, carry, allergies, mail] = e.values;
const recipient = 'hoge@gmail.com';
const subject = '招待状の返信がありました';
const body = `${name}さんは${quantity}名で出欠は「${ans}」です。
${allergies}を持参しますが、${allergies}アレルギーだそうです。`;
GmailApp.createDraft(recipient, subject, body);
}
ダミー回答を送信してみましょう。
Gmailの下書きを開くと、 2件 のメールが作成されています。本来は、送信される予定ではないトリガーも発火してしまっているためです。 メール本文 もあべこべになってしまっています。
トリガーに 「特定のフォームが送信されたら発火する」 という条件を加えることはできないのでしょうか。
トリガーの発火に条件を加える
これまで作成したトリガーは、削除しておきます。
前回作成した、onFormSubmit(e)関数の、関数名を onTshirtsFormSubmit() に変更します。
function onTshirtsFormSubmit(e){
const [timeStamp, name, size, comment] = e.values;
const recipient = 'hoge@gmail.com';
const subject = 'フォームから回答です';
const body = `${name}さんから${size}の注文がありました。コメント:「${comment}」`;
GmailApp.createDraft(recipient, subject, body);
}
スクリプトエディターに、 新たにonFormSubmit()関数 を定義します。
function onFormSubmit(e) {
}
onFormSubmit()関数内で、 onPartyInvitationFormSubmit(e) 、 onTshirtsFormSubmit(e) の、2つの関数を呼び出します。
function onFormSubmit(e) {
onPartyInvitationFormSubmit(e);
onTshirtsFormSubmit(e);
}
このままでは、2つの関数を同時に実行してしまいます。そこで、 イベントオブジェクトに含まれる送信元フォームの情報 を頼りに、 「どちらの関数を実行すればよいのか」 を判定します。
送信元フォームを判定するイベントオブジェクト
スプレッドシートのコンテナバインドスクリプトのフォーム送信時トリガーで発火するイベントオブジェクト内に、 「namedValues」 プロパティがありました。
プロパティへのアクセス方法は、ドット記法です。
e.namedValues
[namedValues] プロパティには、質問と回答がオブジェクト {key:value}方式 で格納されています。
他のフォームに含まれていない、 「ユニークな質問」 を選択することで、 「回答がどのフォームから送信されたか」 を判定できます。※ 「複数のフォーム間で、ユニークな質問がない」 、という状況はあまりないと思われます。なぜなら、 質問が重複していないのであれば、同一のフォームで運用するはず だからです。
hasOwnProperty()メソッドと条件分岐
オブジェクトの中に、プロパティが含まれているか判定するのは、 [.hasOwnProperty()メソッド] です。
hasOwnProperty()メソッドは、引数に 「質問の文字列」 を指定すると、 true か false を返します。
console.log(e.namedValues.hasOwnProperty('参加人数をご記入ください。')); //Boolean
onFormSubmit()にはこのように記述することで、フォーム送信時に、それぞれの関数が実行されます。
function onFormSubmit(e) {
switch (true) {
case e.namedValues.hasOwnProperty('参加人数をご記入ください。'):
onPartyInvitationFormSubmit(e);
break;
case e.namedValues.hasOwnProperty('T シャツのサイズ'):
onTshirtsFormSubmit(e);
break;
}
}
「パーティー招待状」から、ダミー回答を送信してみましょう。
Gmailの下書きに、フォームに対応した下書きが、1件だけ作成されています。
まとめ
以上で、 「スプレッドシートのコンテナバインドのフォーム送信時トリガー」 ということで、 イベントオブジェクト の確認と 多彩なスプレッドシート連携 についてお届けしました。後半は、 フォーム送信時のトリガーの発火 について考察し、 トリガーの条件分岐方法 をご紹介しました。
なお、今回はGmailの下書きを作成しましたが、 「同一シート内に転記(集計)する」 という処理も可能です。ツールのカスタマイズ性が高まると、業務効率化も一気に進みます。引き続き 「実務で使えるツール作り」 を意識しましょう。
次回は、「フォームのコンテナバインドのフォーム送信時トリガー」 をお届けします。