今までの記事一覧
Googleフォーム×GASで実現する業務自動化シリーズ全記事まとめ目次
前提
この記事は、フォーム回答を保存しているスプレッドシート側のGASを前提にしています。
トリガーは以下を設定してください。
- 実行する関数:
onFormSubmit - イベントのソース:スプレッドシートから
- イベントの種類:フォーム送信時
スプレッドシート構成
スプレッドシート「集計シート」をこの図のように設定しています。
- A1:D6 セル:商品マスタ(商品コードや現在の残数が入っている)
- 11行目以下:フォームから送信された注文の受付内容が記録される
- 図の赤字の内容の数式が入っている
※以前作ったこの記事の数式をそのまま生かしています。ただし、変更フォームによって在庫不足による注文数の修正が発生したときのために、有効注文数の数式をほんの少しだけパワーアップさせ=IF(ISNUMBER(修正数のセル), 修正数のセル, 注文数のセル)としておきます。こうすることで、『修正数』の欄に修正後の確定数を書き込むだけで、有効注文数も、商品マスタの残数も、シート側で全自動で連動して計算されるようになります。
おさらい
前回までで、複数商品に対応した在庫引き当てシステムが完成しました。
ユーザーがフォームで注文すると、自動で残数が減り、フォームの内容も動的に更新されます。さらに変更フォームから注文内容を変更でき、その内容に応じた受付メールも自動配信できるようになりました。
さて、このシステムは「お弁当注文」なので、
- 毎朝フォームの受付を開始
- 一定時間にフォームの受付を停止
などの、毎日のルーティンをしたいですよね。
今回から数回にわたって、日次運用を構築していきましょう。
今回のミッション
- フォームが開いていたら受付停止する
- フォームが停止していたら受付開始する
まずはこの基本部分を作っていきます。
今回のキモはコレ!
開いているフォームを受付停止
メソッド .setAcceptingResponses(false) を使います。
const form = FormApp.openById("1******");//フォームの編集用IDを入れる
form.setAcceptingResponses(false);
フォームを停止するだけなら上のままで問題ありませんが、今回は「本日の注文受付は終了いたしました。」というメッセージを表示させます。これはsetCustomClosedFormMessage() を使いますが、このメソッドは受付中のフォームにしか設定できません。すでに受付停止しているフォームに対して実行するとエラーになるため、if (form.isAcceptingResponses() === true) で受付中かどうかを確認してから実行します。
//注文フォームが受付中なら
if (form.isAcceptingResponses() === true) {
//メッセージを入れる
form.setCustomClosedFormMessage("本日の注文受付は終了いたしました。");
// 受付を停止する
form.setAcceptingResponses(false); // 受付を停止
}
このお弁当システムでは、在庫がすべて0になるとフォームが自動で受付停止になります。その場合のメッセージは「本日の注文受付は【完売】のため終了いたしました。」ですが、上のコードではすでに受付停止している場合、このメッセージは変更されずそのまま表示され続けます。
停止しているフォームの受付を再開
先ほどのメソッド setAcceptingResponses() をそのまま、引数を true にして使います。
const form = FormApp.openById("1******");//フォームの編集用IDを入れる
form.setAcceptingResponses(true);
※setAcceptingResponses(true)は受付中のフォームに対して実行してもエラーにならないため、判定せずそのまま実行しています。
:::note
注文フォームのID const form = FormApp.openById("1******") や、
変更フォームのID const form = FormApp.openById("1######") は
複数の関数で使用しているため、グローバルスコープ(グローバル変数) にしたほうが使いやすいかもしれません。
function(){} の外側に移動させるだけで、同じプロジェクト内であれば、ファイル(***.gs)が違っても共通で利用でき、関数の引数として渡す必要もなくなります。
:::
動作確認
現在受付中のフォームに対してフォーム停止を実行すると、このように受付停止し「本日の注文受付は終了いたしました。」と表示されます。
このフォームに対して受付開始を実行すると、無事に受付が再開しました。
ただ、よく見ると、残数が前回のままですね。
毎朝再開する運用を考えた場合、受付再開と同じタイミングで残数もリセットしたいものです。
次回以降に実装していきましょう。
まとめ
今回は、フォームの受付を停止したり再開したりする setAcceptingResponses() メソッドを使いました。
-
setAcceptingResponses(false)とすることで停止 -
setAcceptingResponses(true)とすることで再開
という使い方を紹介しました。
次回は、注文履歴を保存しながら集計シートをリセットし、翌日の受付開始に向けて残数を初期状態に戻す仕組みを作っていきます。
今回の成果コード
実装と運用のしやすさを考え、今回もサブ関数化しています。
また、注文フォームとともに変更フォームも同時に停止/再開するようにしています。
フォームの受付停止
//★グローバルスコープ
const form = FormApp.openById("1******"); // 注文フォームの編集用IDを入れる
const corForm = FormApp.openById("1######"); // 変更フォームの編集用IDを入れる
// フォームの受付を停止する
function formClose() {
//注文フォームが受付中なら
if (form.isAcceptingResponses() === true) {
//メッセージを入れる
form.setCustomClosedFormMessage("本日の注文受付は終了いたしました。");
// 受付を停止する
form.setAcceptingResponses(false); // 受付を停止
}
//変更フォームが受付中なら
if (corForm.isAcceptingResponses() === true) {
corForm.setCustomClosedFormMessage("本日の注文受付は終了いたしました。");
corForm.setAcceptingResponses(false); // 受付を停止
}
}
フォームの受付再開
function formOpen() {
//注文フォームが停止していたら受付開始する
form.setAcceptingResponses(true);
//変更フォームが停止していたら受付開始する
corForm.setAcceptingResponses(true);
}

