カレンダーの空き時間を自動取得して予約受付

GASカレンダー予約システム
カレンダーの空き時間を自動取得して予約受付のサムネイル

カレンダーの空き時間を自動取得して予約受付

はじめに:予約受付の効率化は経営の肝

こんにちは、GASおじです。中小企業の経営者やフリーランスの皆さん、予約管理って意外と手間じゃないですか?電話やメールでやり取りしてると時間もコストもかかるし、ミスも起こりがち。そこで今回はGoogleカレンダーの空き時間を自動で取得して、効率的に予約受付を行う方法を紹介します。

GAS(Google Apps Script)を使えば、追加の専用SaaS料金なし、Googleアカウントの利用枠内で予約システムを作れます。ただしquotaや実行上限はあるので適宜注意してくださいね。おじさんが実務で使える形にこだわってコード例も用意しました。

予約システムの概要

今回の仕組みはこうです。

  • Googleカレンダーから指定期間の空き時間を取得
  • 空き時間を新しい日時付きスプレッドシートに書き出し
  • そこから予約フォームや受付システムと連携可能
  • 既存のデータは上書きしない、バックアップと誤操作防止を重視
  • 入力検証やbatch writeで効率的に書き込み

このシステムのポイントは、カレンダーの情報を直接書き換えず、「新しいスプレッドシートに空き時間リストを吐き出す」方式にしていること。これで誤って既存データを消すリスクを避けています。

初期設定と必要権限

まずGoogle Apps Scriptを使うための初期設定です。

  1. Googleアカウントにログインし、Googleドライブで新しいGASプロジェクトを作成します。
  2. スクリプトでGoogleカレンダーAPIにアクセスできるように、「カレンダー」サービスを有効化してください。
  3. 実行時にカレンダーへの読み取り権限とスプレッドシート作成権限が求められます。承認を忘れずに。
  4. 予約受付を定期的に自動実行したい場合は、**installable trigger(時間主導型トリガー)**を設定してください。
  5. 取り扱う情報は個人情報に当たる場合があります。Googleのポリシーに従い適切に管理しましょう。
  6. もし誤操作が起きた場合は、作成されたスプレッドシートのバージョン履歴やGoogleドライブのバックアップ機能で復元してください。

空き時間取得とスプレッドシート出力のコード例

以下は、Googleカレンダーの予定を取得し、空き時間を新規スプレッドシートに書き出すGASコードです。既存のシートは変更せずに新しいファイルを作成する点に注目してください。

function exportCalendarAvailability() {
  const calendarId = 'primary'; // 対象カレンダーID。'primary'は自分のメインカレンダー
  const now = new Date();
  const rangeStart = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 9);  // 9時開始
  const rangeEnd = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 7, 18); // 1週間後18時まで

  // まず予定を取得
  const events = CalendarApp.getCalendarById(calendarId).getEvents(rangeStart, rangeEnd);

  // 予約受付可能時間帯(9時〜18時)を1時間ごとに区切って空き時間を判定
  const slots = [];
  let slotStart = new Date(rangeStart);

  while (slotStart < rangeEnd) {
    const slotEnd = new Date(slotStart.getTime() + 60 * 60 * 1000); // 1時間後
    // この時間帯に予定があるかチェック
    const isBusy = events.some(event => {
      return event.getStartTime() < slotEnd && event.getEndTime() > slotStart;
    });
    if (!isBusy) {
      slots.push({
        start: new Date(slotStart),
        end: new Date(slotEnd)
      });
    }
    slotStart = slotEnd;
  }

  // 新しいスプレッドシートを作る(日時付き名前)
  const ssName = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss') + '_空き時間リスト';
  const ss = SpreadsheetApp.create(ssName);
  const sheet = ss.getActiveSheet();

  // ヘッダー書き込み
  sheet.getRange(1, 1, 1, 2).setValues([['開始日時', '終了日時']]);

  // 空き時間を書き込み(batch write)
  const values = slots.map(slot => [
    Utilities.formatDate(slot.start, Session.getScriptTimeZone(), 'yyyy/MM/dd HH:mm'),
    Utilities.formatDate(slot.end, Session.getScriptTimeZone(), 'yyyy/MM/dd HH:mm')
  ]);
  if(values.length > 0) {
    sheet.getRange(2, 1, values.length, 2).setValues(values);
  }

  Logger.log(`空き時間リストを作成しました: ${ss.getUrl()}`);
}

ポイント

  • 既存のカレンダーやスプレッドシートは操作せず、新規ファイル作成で結果を保存。
  • 1時間単位で空き時間を判定。必要に応じて分単位のスロットに変更可能。
  • batch writeで複数セルをまとめて書き込み、処理負荷を軽減。
  • 入力検証として、時間帯の範囲を固定し、予定がかぶるかどうかを厳密に判定。

コスト削減の仮定と計算例

たとえば、予約受付にかかっていた電話対応や手動メール返信に1件あたり5分かかっていたとします。1日10件、月20営業日で計算すると、

5分 × 10件 × 20日 = 1000分 = 約17時間/月

時給2000円のスタッフが対応していた場合、

17時間 × 2000円 = 34,000円/月

この時間が半減すれば、17,000円の時間コスト削減が見込めます。もちろん実際の効果は環境により異なりますが、GASで自動化することでこのような工数削減が期待できます。

個人情報の取り扱いと復元手順

空き時間データはカレンダーの予定情報を元に作成します。個人の予定や顧客データが含まれる場合は、Googleの個人情報保護方針に沿って管理してください。スプレッドシートはGoogleドライブ上に保存され、アクセス権限を適切に設定しましょう。

誤ってファイルを削除してしまった場合でも、Googleドライブの「ゴミ箱」から復元可能です。また、スプレッドシートにはバージョン履歴機能があり、過去の状態に戻せます。削除APIを使わない設計なので、元データの消失リスクは低減されています。

まとめと次のステップ

今回はGoogleカレンダーの空き時間を自動取得して、新しいスプレッドシートに書き出すGASスクリプトを紹介しました。これをベースに、

  • フォーム連携で予約受付を自動化
  • Slack通知やメール送信と組み合わせ
  • 複数カレンダー対応や空き時間の細分化

など、業務に合わせてカスタマイズ可能です。

Googleアカウントの利用枠内で追加の専用SaaS料金なしで使えますが、Apps Scriptのquotaや実行上限には注意してくださいね。

もっと実践的なGASツールやテンプレートが欲しい方は、ぜひこちらからメンバーシップに参加してみてください。

GASおじラボで500ツール使い放題 →