はじめに
Googleフォームは無料で使えるアンケートフォームで、何かしらの情報を不特定多数から受け付ける時に非常に気軽にかつ、柔軟に利用できて大変便利です。
ただ、フォームの受付開始、終了については設定画面から手動で行う必要があるため、例えば今回例に上げるような、数量制限のある予約フォームなどを作る場合、標準機能だけで対応するには、定期的に回答を目視で確認し、ある程度余裕を持った所で人間が停止の作業を行う必要がありました。
そこで銀の弾丸、GoogleAppsScriptの登場です。
要件
- 数量は1~5の範囲で選択入力される。
- 上限数量はフォーム回答スプレッドの別シートに設定値を登録する。
-
上限-数量計
が回答できる数量の上限を下回ったら、フォームを閉じる - フォームの再開は手動で行う。
仕様の確認
GASの日本語仕様情報は陳腐化が激しく、また検索スキルも求められます。
素直にオフィシャルのリファレンスを読みます。
https://developers.google.com/apps-script/reference/forms/form
フォームの受付け切り替えは setAcceptingResponses
にBool値を渡す事で実現できるとわかりました。
実装
まずはスプレッドの準備です。
今回はスクリプトをいじれなくても上限の変更や制限の解除ができるよう、スプレッド側に変数を入れることでフォームの有効無効を判断します。
また、下準備として各フォーム、スプレッドのIDを控えておきましょう。
サンプルフォームの項目
- 氏名
- 購入数量
スプレッドシート
以下各シートの内容例です。
シート[フォームの回答1]
氏名 | 購入数量 |
---|---|
佐藤太郎 | 1 |
佐藤花子 | 3 |
シート[設定]
現在の受注数 | 受注制限数 | 残 | 数量上限 | 受注制限 |
---|---|---|---|---|
=SUM('フォームの回答 1'!B:B) |
10 | =B2-A2 |
5 | =IF(C2<D2,FALSE,TRUE) |
この設定シートのE2セル(受注制限セル)がFALSEになったらフォームが閉じるようにします。
スクリプトの実装
諸々の解説は抜きにして、実装内容です。
今回はフォームが閉じたことがわかるようにメールの送信もおまけにつけています。
/*
状態の取得
*/
function orderLimitCheck(){
// 回答スプレッドの数量制限シートを開く
var tgtSpread = SpreadsheetApp.openById('スプレッドのID');
var tgtSheet = tgtSpread.getSheetByName('設定');
// 受注制限状況を取得する
var acceptToggle = tgtSheet.getRange(2,5).getValue();
//フォームの状態を切り替える
formOpenClose(acceptToggle);
}
/*
フォームの受付けを開始する。
toggle : フォームの開始停止の切り替え、Bool値
*/
function formOpenClose(toggle){
// フォームIDを指定してフォームを選択
var tgtForm = FormApp.openById('フォームのID');
// 切り替え要求のBoolと異なる状態であれば
// toggleの状態にフォームを切り替える
if(tgtForm.isAcceptingResponses()!=toggle){
// フォームの受付け状態を切り替える。
tgtForm.setAcceptingResponses(toggle);
var logText = "受注フォームの受付け状態を"+toggle+"に切り替えました。";
Logger.log(logText);
sendLogMail("フォームの受付状況変更通知",logText);
}
}
/*
ログメールの送信
*/
function sendLogMail(title,body){
// 送信先
var to = ['通知先メールアドレス1','通知先メールアドレス2']
GmailApp.sendEmail(to,title,body);
}
トリガの設定
GoogleAppsScriptのトリガには、スプレッドシートからフォーム送信時
という強力な条件があります。
このトリガで上記スクリプトを実行することで、フォーム回答のたびに状態確認が走り、上限に達した瞬間にフォームを閉じることができます。
備考
トリガによってフォームが閉じられると、その時点でフォームを開いていたとしても、回答が送信されないようになっていて、回答が殺到した場合にもきっちり閉じてくれます。
やるね、GoogleAppsScript