Googleフォームで予約受付をしていると、
「同じ時間帯に複数の予約が入ってしまった…」
「気づいたら枠が全部埋まっていたのに受付が続いていた」
といった 二重予約のトラブル が起きがちです。
Googleフォームは便利ですが、標準機能だけでは、“予約枠の管理” や “満席時の自動ストップ” ができません。
そのため、複数の人が同時に送信すると、どうしても予約が重複する可能性があります。
そこで本記事では、Googleフォーム × スプレッドシート を使って、二重予約を確実に防止する仕組み を、初心者向けにやさしく解説します。
- スプレッドシートでの重複チェック
- Apps Scriptによる自動判定
- 満席時のフォーム停止
- エラー時の自動返信
など、コードをコピペするだけで使えるテンプレート付きで紹介するので、教室、イベント、相談予約、店舗など、あらゆる予約管理にそのまま使えます。
「Googleフォームでも二重予約を完全に防ぎたい」
「できれば自動化して手間をなくしたい」
そんな方は、この記事の手順通りに進めるだけで、本格的な予約システムを構築できます。
Googleフォームで二重予約が起こる原因
Googleフォームはアンケートや問い合わせには便利ですが、予約管理システムとして使う前提では作られていません。
そのため、以下のような理由で二重予約が発生しやすい仕様になっています。
① 同じ時間帯の予約を“自動でブロック”できない
Googleフォームには以下のような機能がありません。
- 予約枠の残数管理
- 満席時の自動停止
- 同じ時間帯を選べないようにする制御
そのため、Aさんが送信する直前に、Bさんも同じ時間を選んで送信した場合、どちらも問題なく受け付けられてしまいます。
通常の予約システムでは「残り1席なら、誰かが確定した瞬間に締め切る」動作をしますが、Googleフォームではそれができません。
② シート上の重複チェックが手動になる
Googleフォームの回答はスプレッドシートに保存されますが、
- 同じ日時が入力されたら警告する
- 特定のセルに同じ値が入らないようにする
などの リアルタイム制御はデフォルトでは不可 です。
つまり、重複を見つけるのは管理者の“確認作業”に依存し、忙しい時期にはミスが起こりやすくなります。
③ 同時送信時の「競合(レースコンディション)」が防げない
Googleフォームは、
- ユーザーがフォームを開く
- 項目を入力する
- 「送信」を押す
という流れですが、複数人が同じ時間帯を選んだ状態でフォームを開いてしまうと、その後誰が先に送信しても 全員受付されてしまう 可能性があります。
これはサーバー処理上の特性で、予約システム専用機能がない限り防げません。
④ 回答制限(受付終了)のタイミングは“時間指定”だけ
Googleフォームの「回答制限」は、
- 日時で受付終了を指定する
- 回答数で締め切る
といった「全体」の制御しかありません。
「13:00の枠だけ満席にする」
「15:00の枠はあと1人だけ受付」
といった 枠ごとの制限ができない ため、予約システムとしては弱い仕組みになっています。
⑤ 同じ人の重複送信も防ぎにくい
Googleアカウントログインを必須にすれば多少改善しますが、
- 家族で同じ端末を使う
- 仕事用と個人用のアカウントを持っている
- メールアドレスが複数ある
こういったケースでは、やはり複数予約が可能になってしまいます。
まとめ:デフォルトのGoogleフォームは「予約管理」が不得意
以上の理由から、Googleフォームだけで予約を運用すると、どうしても二重予約のリスクが高くなります。
しかし、フォーム × スプレッドシート × Apps Script を組み合わせれば
- 重複チェック
- 満席時の予約ブロック
- 自動返信
- 予約状況の可視化
まで実現できるため、十分実用的な予約システムが作れます。
二重予約を防ぐための基本対策
Googleフォームはそのままでは二重予約を防げませんが、“いくつかの工夫”を加えるだけで、予約管理の精度を大きく上げることができます。
ここでは、まず Apps Scriptなしでもできる基本対策 から紹介します。
① 回答を Google アカウントに限定する
Googleフォームの設定で「ログインしているユーザーのみ回答可能」にすることで、以下が防げます。
- 同じ人が複数メールアドレスで予約する
- 回答者の匿名による二重予約
- 悪意のある重複送信
- Googleフォーム右上の歯車(設定)をクリック
- 「回答」タブを開く
- 「ログインが必要 → 組織のユーザーに限定(またはメールアドレスを収集)」を ON
これだけで、一人のユーザーが何度も予約するのを抑止できます。
② 予約方法を「選択式」にする(自由記述を使わない)
二重予約が起きる原因の一つが、ユーザーの 入力欄が自由記述(テキスト) の場合。
ユーザーごとに書き方が
- 「13時」
- 「13:00」
- 「1時」
- 「午後1時」
などバラバラになり、シート上の重複チェックができなくなります。
対策:必ずプルダウン・ラジオボタン・チェックボックスで選択式にする。
これにより、Googleフォームの回答が常に同じ表記になり、スプレッドシートでの重複判定がしやすくなります。
③ 予約枠(日時)を小まめに分ける
1つの予約枠に複数の人数を入れない場合、次のように「選択式」で予約枠を分けることで重複しにくくなります。
- 13:00〜
- 13:30〜
- 14:00〜
- 14:30〜
同時刻に複数の人が申し込む確率が下がり、フォーム上でも管理がしやすくなります。
④ 回答後すぐにシート側で確認する(最低限の運用)
最もシンプルな方法ですが、
- 回答が来た時点でシートを確認
- 同じ枠が埋まっていたら早い者勝ちで調整
- 定員に達した枠は手動でフォームを編集して非表示にする
という“手動管理”でも、一応二重予約を防げます。
ただし、シートを常に監視する必要があるため、運用負荷が高くおすすめしません。
⑤ Apps Script を使って「自動で重複チェック」する(最も確実)
最も効果があるのは、Apps Script(Googleスクリプト)で予約枠を自動チェックする方法。
Apps Scriptには以下のような処理を追加できます。
- すでに予約済みの時間帯は受け付けない
- 重複回答の場合はキャンセルメールを自動送信
- 満席になった枠をフォームから自動で非表示にする
後のセクションで コピペで使えるスクリプト も紹介します。
フォームだけでは不十分。必ず「重複対策」を追加しよう
Googleフォーム本体には「予約枠管理機能」がないため、二重予約はどうしても発生します。
しかし対策として、
- Googleアカウント限定で回答
- 予約枠を選択式にする
- 予約枠を細分化する
- Apps Scriptで重複チェックを自動化
これらを組み合わせれば、ほぼトラブルなく予約を運用できます。
スプレッドシートで重複を自動チェックする方法
Googleフォームの予約をスプレッドシートに連携しておけば、スプレッドシート側で「重複チェック」を自動化できます。
ここでは次の3つの方法を紹介します。
- 条件付き書式で重複セルを自動で色分けする(最も簡単)
- COUNTIFS で重複判定用の列を作る(管理しやすい)
- UNIQUE 関数・FILTER関数で“空き枠”を自動表示する(予約枠の残数管理に便利)
① 条件付き書式で重複を自動で色付けする方法(最も簡単)
スプレッドシートの標準機能だけで「同じ日時に予約が重なったセルだけ色がつく」という設定ができます。
【手順】予約日時のセルに重複チェックを適用する
例:C列に「予約日時」が記録されている とします。
1. C列を選択する
クリックして列全体を選択。
2. メニューから「表示形式」 →「条件付き書式」
画面右側に設定パネルが出ます。
3. 条件:カスタム数式を使用 → 次の式を入力
=COUNTIF($C:$C, C1) > 1
4. 色(赤や黄色など)を指定して「完了」
これで、同じ日時が2件以上ある場合、そのセルが自動で色分けされます。
メリット
- もっとも簡単
- Apps Scriptなしでできる
- 誰が見ても重複が一目でわかる
デメリット
- 予約を自動拒否できない(通知はしない)
- シートを開いて目視で確認する必要がある
② COUNTIFS で「重複判定用の列」を作る方法(管理しやすい)
条件付き書式より管理しやすくなる方法です。
予約の一覧シートに「重複」かどうかを判定する 専用の列 を作り、1件だけなら「OK」、2件以上なら「重複」と表示して管理できます。
【手順】重複判定列を作る
例:
- C列:予約日時
- D列:重複判定
とします。
1. D1 に次の式を入力:
=IF(COUNTIF($C:$C, C1) > 1, "重複", "OK")
2. 下までオートフィルでコピー
これだけで、同じ日時が複数ある行だけ「重複」と表示されます。
さらに強力:複数条件を指定できる
例えば「日時とメニューが同じ場合だけ重複にしたい」というケースでは COUNTIFS を使います。
例:
- C列 = 日時
- E列 = メニュー
D列に入力する式:
=IF(COUNTIFS($C:$C, C1, $E:$E, E1) > 1, "重複", "OK")
日時 × メニュー の組み合わせが完全一致したときだけ重複と判定できます。
メリット
- 自動で判定できる
- Apps Scriptなし
- 条件を複数設定できる(日時+メニューなど)
デメリット
- 予約を自動で拒否まではできない
- 「後から確認して調整する」運用になる
③ UNIQUE と FILTER関数で「空き枠」だけのリストを自動作成する
スプレッドシートで予約枠を管理する場合に便利なのが空き枠だけ抽出する仕組み を作る方法です。
例:
- A2:Aに「予約枠一覧(固定データ)」を作成
- フォーム回答シートの C2:C に「予約済み枠」が入る
【手順】空き枠だけのリストを作る
別シートに次の関数を入力します。
=FILTER(A2:A, NOT(COUNTIF(フォーム!C2:C, A2:A)))
これで、
- 予約が入った枠は自動的に除外
- まだ空いている枠だけが一覧表示
されます。
メリット
- 空き枠を自動で管理できる
- 外部ページ(埋め込み)にも応用できる
- Apps Scriptと併用すると「自動選択式更新」も可能
デメリット
- フォームの選択肢を自動で変えるにはApps Scriptが必要
まとめ:スプレッドシートだけでも二重予約は大きく減らせる
ここまで紹介した方法を使えば、Googleフォーム × スプレッドシートでの予約運用でも、二重予約は大きく防げます。
- 条件付き書式で重複セルを可視化
- COUNTIFS で “重複判定列” を作る
- UNIQUE + FILTER で空き枠管理を自動化
Apps Script で二重予約を完全防止(自動拒否)する方法
スプレッドシートの重複チェックだけでは、予約が入った後に気づく「事後対応」 になってしまいます。
しかし、Google Apps Script(GAS)を使えば
- 満席枠の予約を自動で拒否する
- 予約者へ自動でエラーメールを送る
- 二重予約の行を自動削除する
- 管理者へ通知メールも送れる
といった “本物の予約システム” と同等レベル の運用が可能になります。
ここでは、もっともシンプルで汎用的な「完全に二重予約を防止するスクリプト」を紹介します。
前提となるデータ構造
Googleフォームの回答シート
例:「フォームの回答 1」
- A列:タイムスタンプ
- B列:名前
- C列:メールアドレス
- D列:日付
- E列:時間
- F列:メニュー(任意)
予約枠管理シート
例:「予約枠」
- A列:日付
- B列:時間
- C列:定員
- D列:予約数
この形を想定しています。
二重予約を完全防止するスクリプト(コピペOK)
以下のコードをそのまま Apps Script に貼るだけで動きます。
▼ コピペ用コード(満席時に自動で予約を拒否)
function preventDoubleBooking(e) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const formSheet = ss.getSheetByName('フォームの回答 1');
const reserveSheet = ss.getSheetByName('予約枠');
const submitted = e.namedValues;
const date = submitted['日付'][0];
const time = submitted['時間'][0];
const userEmail = submitted['メールアドレス'][0];
const reserveData = reserveSheet.getDataRange().getValues();
// 予約枠の検索
for (let i = 1; i < reserveData.length; i++) {
const reserveDate = reserveData[i][0];
const reserveTime = reserveData[i][1];
const capacity = reserveData[i][2];
const reserved = reserveData[i][3];
// 日付と時間が一致する予約枠を判定
if (reserveDate == date && reserveTime == time) {
// 定員オーバーの判定
if (reserved >= capacity) {
// 1. 予約者へエラーメールを送信
MailApp.sendEmail(
userEmail,
'【予約エラー】満席のため受付できません',
'申し訳ありません。\n選択された日時はすでに満席です。\n別の日時をお選びください。'
);
// 2. フォームの最後の行(今送信された回答)を削除
const lastRow = formSheet.getLastRow();
formSheet.deleteRow(lastRow);
return; // 強制終了
}
}
}
}
スクリプトを動かす手順
1. スプレッドシートを開く
メニュー → 拡張機能 → Apps Script
スクリプトエディタが開きます。
2. コードを貼り付ける
上記のコードをコピペ → 保存(⌘S / Ctrl+S)
3. トリガーを設定
右側メニューの「時計アイコン(トリガー)」を開き、
- 関数:preventDoubleBooking
- イベントの種類:フォーム送信時
- 失敗通知:毎回
に設定して保存。
初回は「権限の承認」が求められるので許可します。
動作の流れ(実際に起こること)
フォームから予約が送信される
↓
GAS が自動起動
↓
予約枠(予約枠シート)を確認
↓
定員以上なら
✔ 予約者へエラーメール
✔ 回答シートから削除
↓
管理側には重複が残らない
→ 二重予約ゼロの状態をキープできる!
改善版:管理者にも自動通知を送る(任意)
通知も欲しい場合は次を追加します。
MailApp.sendEmail(
'管理者のメールアドレス',
'【予約拒否通知】重複予約がありました',
'満席枠に予約が入り、自動で拒否しました。'
);
preventDoubleBooking の中で「return」の前に追加すればOK。
ポイント:この方法は“不正防止力が最強”
✔ 予約が入った瞬間にスクリプトが実行
✔ 満席枠の予約を強制ブロック
✔ シートから自動削除
✔ エラーメールも送信
✔ 管理者の手動対応ゼロ
無料でここまでできる予約システムは他にありません。
カレンダー自動登録で予約管理をもっとラクにする
Googleフォームからの予約を Google カレンダーに自動反映 させることで、管理がさらに効率的になります。
手動でカレンダーに予定を追加する必要がなくなり、見逃し防止・共有のしやすさなどメリットが多くあります。
ここでは、フォーム送信 → スプレッドシート → カレンダーに自動反映 までの流れを、初心者でもそのままコピペで使える形で解説します。
カレンダー自動登録に必要な準備
自動登録の前に以下を準備します。
✔ Googleカレンダー(予約専用)を作成する
管理しやすいように専用カレンダーを作るのがおすすめです。
- Googleカレンダーを開く
- 左側「他のカレンダー」→「+」→「新しいカレンダーを作成」
- カレンダー名を設定して保存
後で Apps Script にこのカレンダーIDを設定します。
カレンダー自動登録のApps Script(コピペでOK)
以下は、スプレッドシートに予約が追加されたら、
自動的に Googleカレンダーへ予定を登録 するスクリプトです。
★ コード(そのまま使えます)
function addToCalendar(e) {
const sheet = e.source.getSheetByName('フォームの回答'); // 回答シート名
const calendarId = 'あなたのカレンダーIDをここに'; // カレンダーID
const calendar = CalendarApp.getCalendarById(calendarId);
const row = e.range.getRow();
if (row === 1) return; // 見出し行はスキップ
const values = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues()[0];
// 例:A列=タイムスタンプ / B列=名前 / C列=日付 / D列=開始時間 / E列=終了時間
const date = values[2];
const startTime = new Date(date + ' ' + values[3]);
const endTime = new Date(date + ' ' + values[4]);
const title = '予約:' + values[1];
// すでに同時間のイベントがある場合はスキップ(安全策)
const events = calendar.getEvents(startTime, endTime);
if (events.length > 0) {
Logger.log('重複のため登録をスキップしました');
return;
}
calendar.createEvent(title, startTime, endTime);
}
トリガーを設定して自動化する
スクリプトを貼っただけでは動かないため、フォーム送信時に自動実行するトリガー を設定します。
トリガー設定手順
- スクリプトエディタ 右上「時計マーク(トリガー)」をクリック
- 「トリガーを追加」
- 下記のように設定する
- 実行する関数 →addToCalendar
- イベントの種類 → 「フォーム送信時」 - 保存して権限を承認する
これで、フォームから予約が送信されるたびに、自動的にカレンダーへ登録 されます。
- 予定を見逃さなくなる
- チーム全員とスケジュールを共有しやすい
- 予約状況が一目でわかる
- 通知機能でリマインドできる
- 二重予約防止のApps Scriptと組み合わせると最強
予約数が多くなるほど「自動登録」の重要性は増します。
予約者へ自動返信メール(確認メール)を送る方法
予約システムとして最低限ほしい機能が、予約者本人に確認メールを自動送信する仕組み です。
Googleフォームは標準では自動返信メールを送れないため、Apps Script を使ってメール送信を追加 します。
★ 自動返信メールのサンプルコード(コピペOK)
function sendConfirmMail(e) {
const responses = e.namedValues;
const email = responses["メールアドレス"][0]; // フォームの質問名に合わせる
const name = responses["お名前"][0];
const date = responses["予約日"][0];
const start = responses["開始時間"][0];
const subject = "【予約を受け付けました】" + date + " " + start;
const body =
name + " 様\n\n" +
"以下の内容で予約を受け付けました。\n\n" +
"■予約日:" + date + "\n" +
"■開始時間:" + start + "\n\n" +
"当日お待ちしております。\n";
MailApp.sendEmail(email, subject, body);
}
トリガー設定
- 「トリガー」画面を開く
- 「トリガーを追加」
- 実行関数名:
sendConfirmMail - イベントの種類 → 「フォーム送信時」
- 保存して権限を承認
これで、予約完了と同時に確認メールが自動送信されます。
予約枠の残数を自動更新する仕組み
「残枠 ○ 名」などを表示したい場合、Google スプレッドシートの COUNTIF(カウント)で管理 できます。
例えば 10枠の予約なら、
1. 予約数を自動カウントする
スプレッドシートに以下を記載(例:B2セル)
=COUNTA('フォームの回答'!A2:A)
※ A列に回答が入る想定
2. 残数を自動計算する
例:B3セルに
=10 - B2
これで 予約が増えるたびに残数が自動的に更新 されます。
★ フォームに残枠を表示したい場合
Googleフォームは動的な数字を表示できないため、以下の方法が使えます。
- Googleサイトに埋め込む(残枠を横に表示)
- フォームの説明文を Apps Script で書き換える
- LINEやメールで残数を通知する
※フォーム本文を自動書き換える方法も可能です。必要ならコードを作成します。
まとめ:Googleフォームでも「本格的な予約システム」は作れる
Googleフォームは本来シンプルなアンケートツールですが、スプレッドシート + Apps Script を組み合わせれば、
- 二重予約の自動防止
- 予約内容のカレンダー自動登録
- 予約者への自動返信メール
- 予約枠の残数を自動管理
- キャンセル・変更の自動処理(追加可能)
といった 本格的な予約システム に進化します。
特に、外部サービスを使うほど規模が大きくない場合は“無料で使える” Googleフォーム予約システムは最強の選択肢です。
必要な処理はすべて「コピペ OK な Apps Script」で実装できるので、自分の運用に合わせてカスタマイズしてみてください。



コメント