最終更新日: 2026-09-27
イベントの受付を10月1日9時に始めたいのに、その時刻に担当者がフォームを開けるとは限らない。そんなときは、フォームや質問を先に準備し、開始時刻に回答受付だけを切り替える方法があります。
Googleフォームの現行ヘルプには、公開済みフォームの受付を手動で停止する操作と、回答の終了日時・回答数上限を設定する操作があります。一方、開始日時を指定して受付を始めるUI手順は掲載されていません。開始を予約したい場合は、Google Apps Script(GAS)の時間主導型トリガーからフォームの受付状態を切り替える方法が候補です。
これはフォーム自体の公開、アクセス権の設定、回答受付の開始を混同しないためのガイドです。トリガーは時計どおりの稼働を厳密に保証する業務スケジューラーではありません。締切や定員の条件も決めたい場合は、記事末尾で触れる既存の標準設定も併用してください。
先に整理する -- 公開と受付開始は同じ操作ではない
回答を受け付けるには、回答者がフォームを開ける状態であることと、フォームが回答を受け付けていることの両方が必要です。リンク共有や公開設定で対象者を決めることと、受付中・停止中を切り替えることは、別々に確認します。
Google公式の回答を表示・管理するヘルプは、公開済みフォームの「回答を受け付け中」から受付を停止する方法、終了日時、回答数上限を案内しています。開始日時の設定項目は、このヘルプ手順にはありません。これはヘルプに掲載された範囲についての判断です。管理画面は更新されることがあるため、作業前に現在のUIも確認してください。
| やりたいこと | まず使う方法 | この記事との関係 |
|---|---|---|
| すぐに回答受付を始める | フォームを公開し、「回答を受け付け中」にする | 手動切り替えで十分 |
| 指定時刻に受付を始める | Apps Scriptの一回限り時間トリガー | 本記事の対象 |
| 指定日時に受付を終える | Googleフォームの終了日時設定 | 締め切り設定ガイドへ |
| 回答数上限で閉じる | Googleフォームの回答数上限 | 同上。厳密な席数保証とは異なる |
| 毎週など繰り返し開閉する | 繰り返しトリガーや専用運用を検討 | 保守・監視を先に設計 |

予約前に決める4つのこと
最初に、フォームのURL、回答者の範囲、開始日時、受付を終える条件を書き出します。公開リンクが組織内だけに制限されていると、開始時刻に受付中へ切り替えても対象外の人は回答できません。逆にリンクを誰でも開ける設定にしたまま受付停止を忘れると、予定外の回答が入る可能性があります。
次に「何時から受け付けるか」をタイムゾーン付きで決めます。日本のイベントなら、例として 2026-10-01T09:00:00+09:00 のように日時と +09:00 を明記できます。Apps Scriptのプロジェクト設定にもタイムゾーンがあります。コードとプロジェクト設定のどちらが時刻解釈に使われるかを曖昧にしないため、プロジェクトを Asia/Tokyo に合わせ、テスト時に実行履歴の時刻も確認します。
| 項目 | 決めておく値 | 確認する理由 |
|---|---|---|
| 開始日時 | 日付、時刻、タイムゾーン | 端末やスクリプトの設定違いを避ける |
| 終了条件 | 終了日時、回答数、手動停止など | 開始後に開きっぱなしになるのを防ぐ |
| 実行担当 | トリガーを作るGoogleアカウント | インストール型トリガーは作成者の権限で実行される |
| 例外時の担当 | 誰が状態を見て手動対応するか | トリガー失敗はフォーム画面に通知されない場合がある |
開始・終了のどちらも自動にするなら、受付期間を「開始より前に閉じておく」「開始トリガーで開く」「終了トリガーまたは標準の終了日時で閉じる」と分けて考えます。受付を開始するだけのコードを入れても、終了時刻に自動で閉じるとは限りません。
GASで一回限りの開始時刻を予約する
Apps ScriptのForms Form APIには、フォームをIDで開く FormApp.openById() と、回答受付を切り替える setAcceptingResponses(enabled) があります。時間主導型トリガーの公式ガイドは、時計ベースのトリガーを作成できることと、インストール型トリガーが作成者の認可で動くことを説明しています。ClockTriggerBuilderの at(date) は指定した日時の一回限りトリガーを作成するメソッドです。
このサンプルは、ひとつのフォームに開始・終了を1回ずつ予約する形です。フォームIDと日時を置き換え、まずテスト用フォームで試してください。過去に同じスクリプトで作った開始・終了トリガーがあれば削除してから作り直します。別アカウントが所有するトリガーは、このスクリプトから一覧・削除できないため、運用担当を一人に決めます。
const FORM_ID = 'ここにフォームID';
const OPEN_AT = '2026-10-01T09:00:00+09:00';
const CLOSE_AT = '2026-10-01T17:00:00+09:00';
function scheduleResponseWindow() {
const now = Date.now();
const openAt = new Date(OPEN_AT);
const closeAt = new Date(CLOSE_AT);
if (Number.isNaN(openAt.getTime()) || Number.isNaN(closeAt.getTime())) {
throw new Error('日時を確認してください');
}
if (openAt.getTime() <= now + 10 * 60 * 1000 || closeAt <= openAt) {
throw new Error('開始には10分以上の余裕を取り、終了を開始後にしてください');
}
const form = FormApp.openById(FORM_ID);
const handlers = ['openScheduledForm', 'closeScheduledForm'];
ScriptApp.getProjectTriggers()
.filter((trigger) => handlers.includes(trigger.getHandlerFunction()))
.forEach((trigger) => ScriptApp.deleteTrigger(trigger));
try {
ScriptApp.newTrigger('openScheduledForm').timeBased().at(openAt).create();
ScriptApp.newTrigger('closeScheduledForm').timeBased().at(closeAt).create();
} catch (error) {
ScriptApp.getProjectTriggers()
.filter((trigger) => handlers.includes(trigger.getHandlerFunction()))
.forEach((trigger) => ScriptApp.deleteTrigger(trigger));
throw error;
}
form.setAcceptingResponses(false);
}
function openScheduledForm() {
FormApp.openById(FORM_ID).setAcceptingResponses(true);
}
function closeScheduledForm() {
FormApp.openById(FORM_ID).setAcceptingResponses(false);
}
FORM_ID はフォーム編集URLの /d/ と /edit の間にある文字列です。スクリプトエディタで一度 scheduleResponseWindow() を手動実行すると、フォームへのアクセスとトリガー作成について認可を求められます。許可を出すGoogleアカウントが、そのフォームの編集権限を持っているかを確認してください。初回の許可画面だけでトリガーが作成されたと考えず、実行完了とトリガー一覧を確認します。
サンプルは開始・終了の日時が10分より先であることをチェックし、開始を迎える前に回答受付を停止します。開始予約の作成に失敗した場合は、この2つの関数に属するトリガーを片付けて例外にします。トリガー作成とフォーム状態変更を一つのデータベース取引にまとめることはできません。フォームを停止する前に両方のトリガーが作成されたことを確認し、部分失敗時には画面と実行履歴を見て再設定してください。
時刻と実行者を正しく扱う
2026-10-01T09:00:00+09:00 のようにUTCオフセットを付けた日時は、実行環境が異なっても瞬間を特定しやすくします。タイムゾーンなしの 2026-10-01 09:00 は避けます。スクリプトプロジェクト設定も Asia/Tokyo にし、テストでは意図した現地時刻と実行履歴の両方を照合します。
インストール型トリガーは、フォームの編集者全員が共有するジョブではありません。Google公式資料では、トリガーはそれを作成したアカウントの認可で動き、別アカウントのトリガーは通常その一覧から見えないと説明されています。担当者の退職、アカウント停止、権限変更があれば、受付開始処理に影響します。個人アカウントに依存させず、組織で管理できる実行アカウントと引き継ぎ方法を決めましょう。
トリガーを二重に作成すると、同じフォームを同じ時刻に複数回更新することがあります。サンプルのようにハンドラー名を限定して整理し、Apps Scriptの「トリガー」画面で作成後の一覧を確認します。ほかの業務で使うトリガーまで削除しないよう、プロジェクトを分ける場合はプロジェクト単位の用途を明記します。
コピーでテストし、実行失敗に備える
本番フォームで開始・終了のテストをすると、回答受付状態を意図せず変える可能性があります。フォームのコピーを作り、実際の開始時刻より数十分先の時刻を設定してください。次の順で確認すると、設定と動作を分けて検証できます。
- 回答者用リンクを別ブラウザで開き、公開範囲と受付停止中の表示を確かめる。
- テスト日時を未来に設定し、スクリプトを手動実行して認可と実行完了を確認する。
- Apps Scriptのトリガー一覧に開始・終了が各1件あることを確かめる。
- 開始後に回答用リンクを再読込し、受付中になったことを確認する。
- 終了後にも確認し、受付停止と終了メッセージを確かめる。
- Apps Scriptの「実行数」またはExecutionsで、両関数の成功時刻と失敗を確認する。
トリガーの実行が失敗しても、編集者が見ていないときに画面上で気付けないことがあります。Google公式ガイドは、実行履歴を開いてエラーを調べる方法を案内しています。通知メールが来るかだけに頼らず、開始前後に受付状態を確認する担当を置きます。トリガー実行時間は、分単位で絶対に遅れないことが必要な処理の保証として使わないでください。
失敗時の手動手順も短く決めておきます。開始時刻を過ぎてもフォームが閉じていれば、編集者がフォームを開き、日時・公開範囲・トリガー履歴を確認してから、必要なら「回答を受け付け中」を手動で切り替えます。早く開いてしまった場合は受付停止し、既に回答があれば記録して運営担当へ連絡します。公開リンクの変更や回答の削除を、その場しのぎで先に行わないようにします。
開始と終了は別々に検証する
開始時刻を予約できても、締め切り方法を選んだことにはなりません。回答数が一定に達したら閉じたい、または特定日で終了したいなら、Googleフォームの現行標準設定を使えるか確認します。#115のGoogleフォームの締め切り設定ガイドでは、終了日時、回答数上限、手動停止、同時回答が上限を超える可能性を説明しています。
回答数上限はフォーム全体の送信件数であり、選択肢別の席数や同時予約を厳密に守る仕組みと同じではありません。申込数を1件も超えられない運用では、追加のApps Scriptだけで予約受付の安全性が確保されたとみなさず、回答確定を一つのトランザクションで制御できる仕組みを検討します。
よくある質問
Googleフォームに受付開始日時の標準設定はありますか?
今回確認したGoogle公式の回答管理ヘルプは、手動停止、終了日時、回答数上限を案内し、開始日時の予約手順は掲載していません。UIは変わる可能性があるため、設定時に現在の画面も確認してください。開始を自動化したい場合は、Apps Scriptなどが候補です。
フォームを非公開にして、時刻になったら公開できますか?
共有・公開範囲と回答受付状態は別の設定ですが、Apps ScriptのForm APIは公開状態の変更により受付状態が上書きされる場合を説明しています。スケジュール作成後に公開状態や共有設定を変更したら、受付状態とトリガーを再確認してください。この記事の方法では、回答者の対象をあらかじめ決めてから受付状態を時間トリガーで切り替えます。
開始と終了を同時に予約できますか?
Apps Scriptで開始と終了の一回限りトリガーをそれぞれ作る方法があります。ただし、標準UIの終了日時も利用できる場合は、どちらが停止処理を担当するか一つに決めて、二重管理や時刻ずれを避けてください。終了条件の選び方は#115を参照してください。
トリガーは指定分に必ず実行されますか?
厳密な実行時刻を保証する仕組みとして扱わないでください。実行履歴、フォームの受付状態、通知を確認し、時間に遅れが許されない場合は担当者が監視できる手順を用意します。重大な決済・定員処理をフォーム状態だけに依存させないでください。
毎週の受付開始にも使えますか?
定期トリガーも作れますが、営業時間、祝日、例外日、所有者変更、実行上限の確認が増えます。まず単発のコピーで試し、繰り返し運用が本当に必要か判断します。Apps ScriptとSheetsを含む責務分担は、親hubのGoogleフォーム・スプレッドシート・GAS運用ガイドに整理しています。
執筆・確認情報
この記事は2026年9月27日に構成と動作根拠を確認しました。Apps Scriptの仕様はForm API、インストール型トリガー、ClockTriggerBuilder、現行UIの範囲はGoogleフォーム回答管理ヘルプを参照しています。標準UIに開始日時設定がないという説明は、同ヘルプが列挙する操作範囲に基づく判断です。画面名や機能提供範囲は変わるため、実際の設定前にGoogleフォームの現在の表示を確認してください。
まとめ
指定時刻に回答受付を始めるには、共有設定と受付状態を分け、Apps Scriptの一回限りトリガーから setAcceptingResponses(true) を呼び出す方法があります。フォームID、実行アカウント、タイムゾーン、終了条件を決め、コピーで開始・終了の両方を確認してから運用に移してください。
受付開始後の回答管理や、開始時刻に担当者が張り付かない運用をまとめて見直したい場合は、FORMLOVAを無料で試すこともできます。


