GASでカレンダーの空き時間を自動チェックする方法

GASカレンダー自動化
GASでカレンダーの空き時間を自動チェックする方法のサムネイル

こんにちは、GASおじです。今回は、Google Apps Script(以下GAS)を使ってGoogleカレンダーの空き時間を自動でチェックし、中小企業の経営者やフリーランスの皆さんのスケジュール管理を手助けする方法を紹介するよ。

忙しい経営者やフリーランスの方にとって、スケジュール調整は頭の痛い問題。GASを使えば、Googleカレンダーの情報を自動で取得し、空き時間を抽出して別ファイルにまとめることができる。これで、無駄なやりとりを減らし、業務効率化に繋がるはずだ。

この記事では、実際に動く具体的なコード例を示しつつ、既存データの保護や入力検証、バッチ書き込み、バックアップや復元方法まで解説する。もちろん、Googleアカウントの利用枠内で追加の専用SaaS料金なし(Apps Scriptのquota・実行上限あり)で実現可能だ。


初期設定と必要権限

まずはスクリプトを動かすための初期設定から。GASのプロジェクトを作成し、GoogleカレンダーAPIの利用を有効にしよう。手順は以下の通りだ。

  1. Google Apps Script にアクセスし、新規プロジェクトを作成。
  2. メニューの「サービス」から「Google カレンダー API」を追加。
  3. スクリプトエディタのメニュー「編集」→「現在のプロジェクトのトリガー」から、必要に応じてinstallable trigger(時間主導型など)を設定。

このスクリプトはGoogleカレンダーの読み取り権限が必要になるため、初回実行時に認証を求められる。プライバシーに配慮し、個人情報はスクリプト内で扱うが、外部に送信したり保存したりしない運用を心がけてほしい。


カレンダー空き時間チェックの流れ

今回のスクリプトは、

  • 期間を指定してGoogleカレンダーのイベントを取得
  • 既存の空き時間情報は新規ファイル(スプレッドシート)に出力し、既存データを上書きしない
  • 取得データの妥当性をチェック
  • バッチ処理で効率的に書き込み
  • バックアップも同時に作成し、必要なら復元が可能

という方針で進める。


実際のコード例

以下のコードは、指定期間のカレンダーイベントを取得し、空き時間を計算した結果を新しいスプレッドシートに書き出す例だ。既存ファイルは更新しないので安心して使える。

function checkCalendarFreeSlots() {
  const calendarId = 'primary'; // 変更可。特定カレンダーのIDも指定可能
  const now = new Date();
  const startTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 9, 0, 0); // 当日9時開始
  const endTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 18, 0, 0); // 当日18時まで

  // 入力検証
  if (startTime >= endTime) {
    throw new Error('開始時間は終了時間より前である必要があります');
  }

  // 期間内のイベントを取得
  const events = Calendar.Events.list(calendarId, {
    timeMin: startTime.toISOString(),
    timeMax: endTime.toISOString(),
    singleEvents: true,
    orderBy: 'startTime'
  }).items;

  // 空き時間計算のための初期設定
  let freeSlots = [];
  let cursor = startTime;

  // イベントの開始・終了を使って空き時間を算出
  for (let event of events) {
    let eventStart = new Date(event.start.dateTime || event.start.date);
    let eventEnd = new Date(event.end.dateTime || event.end.date);

    // イベント開始前に空き時間がある場合
    if (cursor < eventStart) {
      freeSlots.push({ start: new Date(cursor), end: new Date(eventStart) });
    }
    // cursorをイベント終了時間に更新(後のイベントと比較)
    if (eventEnd > cursor) {
      cursor = eventEnd;
    }
  }

  // 最後のイベント終了後の空き時間も追加
  if (cursor < endTime) {
    freeSlots.push({ start: new Date(cursor), end: new Date(endTime) });
  }

  if (freeSlots.length === 0) {
    Logger.log('指定期間中に空き時間はありません。');
  }

  // 新規スプレッドシート作成(既存データは変更しない)
  const spreadsheet = SpreadsheetApp.create('カレンダー空き時間_' + Utilities.formatDate(now, Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss'));
  const sheet = spreadsheet.getActiveSheet();

  // ヘッダ設定
  const header = [['開始日時', '終了日時', '空き時間(分)']];
  sheet.getRange(1, 1, 1, header[0].length).setValues(header);

  // バッチ用データ作成
  const rows = freeSlots.map(slot => {
    const start = Utilities.formatDate(slot.start, Session.getScriptTimeZone(), 'yyyy/MM/dd HH:mm');
    const end = Utilities.formatDate(slot.end, Session.getScriptTimeZone(), 'yyyy/MM/dd HH:mm');
    const diffMinutes = Math.round((slot.end - slot.start) / 60000);
    return [start, end, diffMinutes];
  });

  // 一括書き込み
  if (rows.length > 0) {
    sheet.getRange(2, 1, rows.length, rows[0].length).setValues(rows);
  }

  Logger.log('空き時間データを新規スプレッドシートに出力しました: ' + spreadsheet.getUrl());

  // バックアップとしてスプレッドシートのコピーをDrive内に保存(復元用)
  // 実際の環境に合わせて保存先フォルダIDを指定してください
  const backupFolderId = 'YOUR_BACKUP_FOLDER_ID'; // ここは適宜変更
  try {
    const backupFolder = DriveApp.getFolderById(backupFolderId);
    const backupFile = DriveApp.getFileById(spreadsheet.getId()).makeCopy('バックアップ_' + spreadsheet.getName(), backupFolder);
    Logger.log('バックアップファイルを作成しました: ' + backupFile.getUrl());
  } catch (e) {
    Logger.log('バックアップ作成に失敗しました: ' + e.message);
  }
}

installable triggerと復元手順

このスクリプトは定期的に実行すると便利なので、GASのinstallable triggerを設定してみよう。例えば、毎朝9時に空き時間をチェックし、レポートを自動生成するイメージだ。

  1. スクリプトエディタの「編集」→「現在のプロジェクトのトリガー」を開く。
  2. 「トリガーを追加」をクリック。
  3. 関数に checkCalendarFreeSlots を選択。
  4. イベントの種類で「時間主導型」→「日付ベースのタイマー」→「午前9時~10時」を選択して保存。

復元が必要な場合は、バックアップ用フォルダに保存されているスプレッドシートのコピーからデータを取り戻せる。スプレッドシートのファイルを開き、内容を元に戻す作業を行うと良いだろう。


コスト削減の考え方(仮定と計算式)

GASおじとしては、こうした自動化は「時間=コスト」の削減に直結すると考えている。例えば、

  • 1回のスケジュール調整にかかる手間:15分
  • 1ヶ月の調整回数:10回
  • 時給換算:2,000円

と仮定すると、

15分 × 10回 = 150分 = 2.5時間
2.5時間 × 2,000円 = 5,000円/月

の時間コストが削減可能になる計算だ。もちろん、この数字はあくまで例なので、実際の環境に合わせて見積もってほしい。


まとめ

  • Googleカレンダーの空き時間をGASで自動取得し、別スプレッドシートに出力する方法
  • 既存データは消さず、新規ファイルに書き出すので安全
  • 入力検証やバッチ書き込み、バックアップ・復元の仕組みも組み込み済み
  • Googleアカウントの利用枠内で追加の専用SaaS料金なし(Apps Scriptのquota・実行上限あり)
  • installable triggerで定期実行も可能

これでスケジュール調整の無駄なやりとりが減り、時間効率化の一助になるはずだよ。ぜひ試してみてくれ。


GASおじラボでは500以上の便利ツールをまとめて使えるメンバーシップもやってるよ。興味ある人はぜひこちらからどうぞ。

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