GASでGoogleフォームの予約をカレンダーに自動登録|会議室・面談予約の受付を自動化

スポンサーリンク

会議室の予約、面談の受付、備品の貸出申請。こうしたフロント業務を「Googleフォームで受け付けてはいるけれど、結局その内容を見ながら手作業でカレンダーに予定を入れている」という方は多いのではないでしょうか。フォームの回答を1件ずつ確認してカレンダーに転記する作業は、件数が増えるほど時間を取られますし、転記ミスやダブルブッキングの原因にもなります。

この記事では、Googleフォームで受け付けた予約(希望日時・氏名・用件)を、GAS(Google Apps Script)を使ってGoogleカレンダーに自動登録する仕組みを作ります。フォームが送信された瞬間にカレンダーへ予定が入り、予約者には確認メールが自動で届く。さらにダブルブッキングを検知して弾く応用まで、コピペで動くコード付きで解説します。

GASをはじめて触る方は、先にGAS入門|スプレッドシート自動化のはじめの一歩に目を通しておくと、スクリプトエディタの開き方や保存・実行の流れがスムーズに理解できます。

完成イメージと全体の流れ

まず、これから作る仕組みの全体像を押さえておきましょう。やることはシンプルで、次の3ステップです。

  1. Googleフォームで予約を受け付ける(希望日時・氏名・用件などを質問項目にする)
  2. フォームの回答先スプレッドシートにGASを書く
  3. 「フォーム送信時」のトリガーを設定し、回答が来るたびにカレンダーへ自動登録する

ポイントは、GASをフォームそのものではなく、回答が貯まるスプレッドシート側に書くことです。Googleフォームを作ると「回答」タブからスプレッドシートを連携できますが、そのスプレッドシートに紐づくスクリプトを使うと、回答内容を扱いやすくなります。

処理の流れを図にすると次のようになります。

[予約者] フォームに入力・送信
      ↓
[フォーム] 回答をスプレッドシートに記録
      ↓
[GAS] onFormSubmit トリガーが発火
      ↓
[GAS] 回答内容を読み取り → カレンダーに予定を作成
      ↓
[GAS] 予約者へ確認メールを送信

準備:フォームと回答スプレッドシートを用意する

最初に、予約を受け付けるGoogleフォームを作ります。今回は会議室予約を例に、次の質問項目を用意します。

  • 氏名(記述式・短文)
  • メールアドレス(記述式・短文/確認メールの送信先になります)
  • 予約希望日(日付)
  • 開始時刻(時刻)
  • 利用時間(分)(プルダウン:30 / 60 / 90 / 120 など)
  • 用件(記述式・段落)

フォームができたら、編集画面の「回答」タブにある「スプレッドシートにリンク」をクリックして、回答先のスプレッドシートを作成します。これでフォームが送信されるたびに、1行ずつ回答がスプレッドシートに追記されるようになります。

スプレッドシートの1行目(ヘッダー)は、フォームの質問順に次のように並びます。

ABCDEFG
タイムスタンプ氏名メールアドレス予約希望日開始時刻利用時間(分)用件

A列の「タイムスタンプ」はフォームが自動で付ける送信日時です。B列以降が、自分で作った質問の回答になります。列の順番はコードの中で位置指定して読み取るので、この並びをしっかり確認しておいてください。質問を入れ替えると列もずれるので注意します。

カレンダーに自動登録する基本コードを書く

それでは本題のコードです。回答スプレッドシートを開いた状態で、メニューの「拡張機能」→「Apps Script」を開き、スクリプトエディタを表示します。

デフォルトのコードをすべて消して、次のコードを貼り付けてください。

// ===== 設定 =====
// 登録先カレンダーのID。自分のメインカレンダーなら 'primary' のままでOK。
// 共有カレンダーを使う場合は、カレンダー設定の「カレンダーの統合」にある
// 「カレンダーID」(xxxx@group.calendar.google.com)をコピペする。
const CALENDAR_ID = 'primary';

// フォーム送信時に実行されるメイン関数
function onFormSubmit(e) {
  // e.values は [タイムスタンプ, 氏名, メール, 希望日, 開始時刻, 利用時間, 用件]
  const values = e.values;

  const name      = values[1]; // 氏名
  const email     = values[2]; // メールアドレス
  const dateStr   = values[3]; // 予約希望日(例: 2026/07/01)
  const timeStr   = values[4]; // 開始時刻(例: 14:00)
  const duration  = Number(values[5]); // 利用時間(分)
  const purpose   = values[6]; // 用件

  // 開始日時と終了日時を組み立てる
  const start = buildDateTime(dateStr, timeStr);
  const end   = new Date(start.getTime() + duration * 60 * 1000);

  // カレンダーに予定を作成
  const calendar = CalendarApp.getCalendarById(CALENDAR_ID);
  const title = '【会議室予約】' + name + '様 / ' + purpose;

  calendar.createEvent(title, start, end, {
    description: '予約者: ' + name + 'n連絡先: ' + email + 'n用件: ' + purpose,
    guests: email,            // 予約者をゲストに追加(任意)
    sendInvites: false        // 招待メールを送るかどうか
  });

  Logger.log('予定を登録しました: ' + title);
}

// 「2026/07/01」と「14:00」から Date オブジェクトを作るヘルパー
function buildDateTime(dateStr, timeStr) {
  // 日付の区切りは / でも - でも拾えるようにする
  const d = dateStr.replace(/-/g, '/').split('/'); // [2026, 07, 01]
  const t = timeStr.split(':');                     // [14, 00]
  return new Date(
    Number(d[0]),       // 年
    Number(d[1]) - 1,   // 月(0始まりなので -1)
    Number(d[2]),       // 日
    Number(t[0]),       // 時
    Number(t[1])        // 分
  );
}

コードの要点を順番に見ていきます。

  • e.values:フォーム送信時トリガーで自動的に渡される引数 e の中に、その回答1件分のデータが配列で入っています。values[0] がタイムスタンプ、values[1] が1問目の回答……と続きます。フォームの質問順とインデックスが対応している点が重要です。
  • buildDateTime 関数:フォームの日付・時刻はテキストとして渡ってくるため、そのままでは予定の開始日時に使えません。年・月・日・時・分に分解してDateオブジェクトを組み立てます。JavaScriptの月は0始まり(1月が0)なので、-1 するのを忘れないでください。
  • createEvent:タイトル・開始日時・終了日時を渡すと予定が作られます。第4引数のオブジェクトで説明文やゲストを追加できます。

CalendarApp の詳しい仕様はGoogle公式のCalendarApp リファレンスも参考になります。

フォーム送信時トリガーを設定する

コードを書いただけでは自動実行されません。「フォームが送信されたら onFormSubmit を動かす」というトリガーを設定して、はじめて自動化が完成します。

スクリプトエディタの左メニューにある時計マークのアイコン(トリガー)をクリックし、画面右下の「トリガーを追加」を押します。設定は次の通りです。

  • 実行する関数:onFormSubmit
  • 実行するデプロイ:Head
  • イベントのソース:スプレッドシートから
  • イベントの種類:フォーム送信時

保存しようとすると、初回はGoogleアカウントへのアクセス承認を求められます。「許可」を進めて承認してください(自分のアカウントでカレンダーやメールを操作するための権限です)。

トリガーの仕組みや種類をもっと詳しく知りたい方は、GASのトリガーで集計・通知を自動化する方法で時間主導型トリガーなども含めて解説しています。

設定が終わったら、実際にフォームから1件テスト送信してみましょう。カレンダーを開いて、指定した日時に予定が入っていれば成功です。うまく動かないときは、スクリプトエディタの「実行数」(トリガーの実行ログ)を開くと、エラー内容を確認できます。

予約者へ確認メールを自動送信する

予約を受け付けたら、予約者本人に「受け付けました」という確認メールを自動で返すと、予約システムらしさがぐっと増します。onFormSubmit 関数の末尾に、メール送信処理を追加しましょう。

先ほどのコードの Logger.log(...) の行の前に、次のコードを追記します。

  // ===== 確認メールを送信 =====
  const subject = '【予約受付完了】会議室のご予約を承りました';
  const body =
    name + ' 様nn' +
    'このたびはご予約いただきありがとうございます。n' +
    '以下の内容で予約を承りました。nn' +
    '----------------------------------------n' +
    '日時: ' + formatJp(start) + ' 〜 ' + formatTime(end) + 'n' +
    '用件: ' + purpose + 'n' +
    '----------------------------------------nn' +
    '※このメールは自動送信です。変更・キャンセルはご返信ください。';

  GmailApp.sendEmail(email, subject, body);

そして、日時を読みやすく整形するヘルパー関数を、ファイルの末尾に追加します。

// 「2026年07月01日(火) 14:00」の形式に整形
function formatJp(date) {
  return Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy年MM月dd日(E) HH:mm');
}

// 「15:00」のように時刻だけ整形
function formatTime(date) {
  return Utilities.formatDate(date, 'Asia/Tokyo', 'HH:mm');
}

GmailApp.sendEmail(宛先, 件名, 本文) の3つを指定するだけで、自分のGmailアカウントから確認メールが送られます。Utilities.formatDate はDateを好きな書式の文字列に変換する関数で、Asia/Tokyo を指定して日本時間で表示しています。

メール送信には1日あたりの上限があります(無料のGmailアカウントで100通/日程度)。予約件数が少ない社内利用なら問題になりませんが、大量送信を想定する場合は上限に注意してください。

フォームの回答を集計したり別シートに転記したりする処理を組み合わせたい場合は、Googleフォームの回答をGASで自動集計する方法も合わせて読むと、予約データの管理まで一気通貫で自動化できます。

ダブルブッキングを検知して弾く【応用】

会議室や面談枠のように「同じ時間帯に1件しか入れられない」予約では、ダブルブッキングの防止が欠かせません。GASなら、登録前にその時間帯に既存の予定がないかをチェックできます。

createEvent を呼ぶ直前に、次の判定を入れます。onFormSubmit 関数の const calendar = ... の後ろに追記してください。

  // ===== ダブルブッキング検知 =====
  // start〜end の時間帯に既存の予定があるか調べる
  const existing = calendar.getEvents(start, end);

  if (existing.length > 0) {
    // すでに予定がある → 登録せずにお詫びメールを送る
    const ngSubject = '【ご予約について】ご希望の時間帯は満席です';
    const ngBody =
      name + ' 様nn' +
      'あいにくご希望の日時(' + formatJp(start) + ')はn' +
      'すでに他のご予約が入っております。n' +
      'お手数ですが、別の日時で再度お申し込みください。';
    GmailApp.sendEmail(email, ngSubject, ngBody);
    Logger.log('ダブルブッキングのため登録をスキップ: ' + name);
    return; // ここで処理を終了し、カレンダー登録に進ませない
  }

calendar.getEvents(start, end) は、指定した期間に重なる予定を配列で返します。配列の要素が1つでもあれば(length > 0)、その時間帯はすでに埋まっているということです。その場合は登録を行わず、予約者に「満席」のお詫びメールを送って return で処理を終了します。

これで、同じ時間帯への二重予約を自動でブロックできます。ただし、フォーム送信がほぼ同時に2件来た場合はすり抜ける可能性がゼロではないので、厳密な排他制御が必要な業務では、登録後にダブりが起きていないか定期チェックする運用も検討してください。

まとめ:受付業務はGASで自動化できる

Googleフォームの予約をGoogleカレンダーに自動登録する仕組みを、基本から応用まで作ってきました。今回のポイントを振り返ります。

  • GASは回答先スプレッドシートに書き、onFormSubmit 関数で回答内容を受け取る
  • e.values の配列インデックスはフォームの質問順に対応する
  • 日付・時刻のテキストは buildDateTime でDateに組み立て、createEvent で予定を作成する
  • 「フォーム送信時」トリガーを設定してはじめて自動実行される
  • GmailApp.sendEmail で確認メールを、calendar.getEvents でダブルブッキング検知を追加できる

一度組んでしまえば、あとはフォームのURLを共有するだけで、予約の受付からカレンダー登録・確認メールまでが完全に自動で回ります。会議室予約だけでなく、面談予約・設備の貸出申請・イベントの参加受付など、「日時を指定して申し込む」あらゆる業務に応用できます。

GASでできる自動化の幅をさらに広げたい方は、GAS入門|スプレッドシート自動化のはじめの一歩から基礎を固めていくのがおすすめです。手作業の受付業務を、ぜひこの機会に手放してみてください。

タイトルとURLをコピーしました