Googleフォームの2つ以上の質問の選択肢に定員(人数制限)を設定できます。
今回は、注文メニューから在庫数より多い注文個数の選択肢の項目を消す、在庫数を表示する、2つ以上の注文メニューに対応したフォームです。
前の記事で作成したGAS(updateItems)とスプレッドシートの関数を組み合わせて実現しました。
次の記事からの続きです。GASで組んだ関数updateItemsを今回も使います。
応用例その7
デリバリー予約フォーム
このフォームは、在庫より多い注文数の選択肢の項目をメニューより消すことで選べなくしています。
また、在庫数を表示します。
そして、このフォームの最大の特徴は、メニュー(質問)が2つ(以上)あることです。
※通常は、選択肢の項目を消すことで定員(注文数)を制限する方法は、フォームの1つの質問に対して選択肢の項目を1つ以上残す必要があるため、2つ以上の質問に対しての制限は困難です。今回の方法は裏技的かもしれませんね。
①質問、②選択肢、③説明
GASの登録
次の記事に従ってGAS(updateItems)をこのフォームに登録してください。
スプレッドシートの関数
次に、フォームとリンクしたスプレッドシートに2枚のシート(シート1、シート2)を用意しました。
このシートの内容がGAS(updateItems)で使用されます。
①フォームの質問
②質問の選択肢
③質問の説明~このB列を質問の説明に表示します。
④参照セル~このC列の値がゼロ"0"以下になると、フォームの質問の選択肢から消えます。(このシートのA列は消えません。)
このシートの数式を表示([Ctrl]+@)してみます。
テーブル(コピペ用)で表示します。
タイムスタンプ | ホットコーヒー | 軽食 | お名前(代表者) |
ホットコーヒー | ="あと"&D2&"個、注文できます。" | 注文可能数 | 残数 | 注文数 | 注文上限数 |
注文なし | =N(OR('シート1'!D2,'シート2'!D2)) | =F2-E2 | =SUM('フォームの回答'!B:B) | 50 | |
5 | =INT($D$2/A3) | ||||
10 | =INT($D$2/A4) | ||||
15 | =INT($D$2/A5) | ||||
20 | =INT($D$2/A6) | ||||
25 | =INT($D$2/A7) | ||||
30 | =INT($D$2/A8) | ||||
35 | =INT($D$2/A9) | ||||
40 | =INT($D$2/A10) | ||||
45 | =INT($D$2/A11) | ||||
50 | =INT($D$2/A12) |
軽食 | ="あと"&D2&"個、注文できます。" | 注文可能数 | 残数 | 注文数 | 注文上限数 |
注文なし | =N(OR('シート1'!D2,'シート2'!D2)) | =F2-E2 | =SUM('フォームの回答'!C:C) | 50 | |
5 | =INT($D$2/A3) | ||||
10 | =INT($D$2/A4) | ||||
15 | =INT($D$2/A5) | ||||
20 | =INT($D$2/A6) | ||||
25 | =INT($D$2/A7) | ||||
30 | =INT($D$2/A8) | ||||
35 | =INT($D$2/A9) | ||||
40 | =INT($D$2/A10) | ||||
45 | =INT($D$2/A11) | ||||
50 | =INT($D$2/A12) |
関数自体はそう難しいものはありません。
今回のポイントは、2つの質問(ホットコーヒー、軽食)に対して、それぞれにupdateItemsが使われています。
そのため2枚のシート(シート1、シート2)を作る必要があります。
このとき問題になるのが、受付け終了のタイミングです。
今回は質問(ホットコーヒー、軽食)の残数がゼロの時にフォームの受付けを終了したいのですが、2つあるためどちらかの残数がゼロになっても、もう片方が残数ゼロになるまで待たなくてはなりません。
そのために選択肢の中に最後まで消えない項目が必要です。
今回は「注文なし」を設けました。
2枚のシートの残数がゼロになった時に「注文なし」を消す、つまり受付けを終了にするように「注文なし」のフラグ(セル:C2)を次のようにしています。
=N(OR('シート1'!残数, 'シート2'!残数))
2つの残数がゼロになった時、値がゼロになります。つまりフォームの受付け終了となります。
GASの追加登録とトリガーの設定
今回はupdateItemsを2つの質問に対応させているため、フォームからの1度の送信に対して2つのupdateItemsを実行する必要があります。
そこで、次のようなスクリプトを追加します。
function myFunction() {
updateItems(1);
updateItems(2);
}
ファンクション名は、何でもよいですが、ここでは、myFunctionにしました。
updateItemsの引数の1、2は、スプレッドシートでのタブの位置です。左から、0、1、2、3...になります。
今回の場合は、シート1は引数が1、シート2は引数が2です。当然、フォームの回答は0です。
※タブの位置と引数だけ対応させたら、タブの位置は任意です。念のため、シート名は元々自由です。
トリガーにmyFunctionだけ登録できたら準備完了です。
実行(回答)と結果
時短のため注文上限数は、コーヒー、軽食とも20個にしてあります。
実行(プレビュー)します。
ホットコーヒーを10個、軽食を15個選びました。
送信後のプレビューです。
注文可能数がゼロになった選択肢の項目が消えました。残数も更新されています。
ホットコーヒーを5個、軽食を5個選びました。送信後のプレビューです。
軽食の選択肢に「注文なし」が残っています。
最後のホットコーヒーを選びました。
全ての残数がゼロになりましたので、自動で回答の受付けが終了しました。
補足説明
今回のフォームでは、メニュー(選択肢)に「注文なし」があります。
選択条件には「必須」設定をしました。これだとメニューを選ぶ必要がなくても、必ず「注文なし」を選ばなくてはなりません。
少しでも使い易くするためにフォームの「事前入力したURLを取得」で初期値に「注文なし」を使うことをお勧めします。
毎回このリンクへアクセスするなら、すでに「注文なし」が入力されているため使い勝手が良いと思います。
どうぞお試しください。
おわりに
いかがでしたか。フォームの本来ない使い方をぎりぎりまで攻められたのではないでしょうか。
メニューの数を2つ以上に増やしていけば、なんちゃってオーダーシステムができるかもしれませんね。
メニューの項目が消えていく様は、まるでデータベースを使っているようです。
ですがあまり多くするのは、個人的にはお勧めできません。管理するシートの数が増えたらとても面倒です。(体験済)
その時は無理せずデータベースの導入を考えましょうね。
それではまた、
コメント