カレンダーの二重登録を作成前に発見|GASで予定候補をdry-run監査

カレンダーの二重登録を作成前に発見|GASで予定候補をdry-run監査

ツールおじ|GoogleアカウントをAIエージェント化

ツールおじ|GoogleアカウントをAIエージェント化

同じ会議を二重に登録して、参加者への通知や予定調整が混乱したことはありませんか。この記事では、スプレッドシート上の予定候補とGoogleカレンダーの既存予定を照合し、作成や削除を一切せずに重複候補だけをログへ出す最小GASを紹介します。

先に知っておきたいこと

  • 予定のタイトル、開始・終了日時を検査します。
  • カレンダーへの作成、変更、削除、招待送信は行いません。
  • 同名でも日時が異なる予定は別予定として扱います。
  • 実行時間や取得件数にはGoogle Apps Scriptの上限があります。

準備するシート

「予定候補」シートを作り、1行目に「タイトル」「開始日時」「終了日時」を用意します。日時はスプレッドシートの日付形式で入力してください。まずは個人情報を含まない少量のテストデータで確認します。

コピーして使える最小コード

function auditCalendarDuplicatePlanFree() {
  const DRY_RUN = true;
  const SHEET_NAME = '予定候補';
  const MAX_ROWS = 50;
  const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
  if (!sheet) throw new Error('予定候補シートが見つかりません');

  const lastRow = sheet.getLastRow();
  if (lastRow < 2) throw new Error('監査する予定候補がありません');
  if (lastRow - 1 > MAX_ROWS) throw new Error('一度に監査できるのは50件までです');

  const rows = sheet.getRange(2, 1, lastRow - 1, 3).getValues();
  const calendar = CalendarApp.getDefaultCalendar();
  const seen = new Set();

  rows.forEach((row, index) => {
    const title = String(row[0] || '').trim();
    const start = row[1];
    const end = row[2];
    const rowNumber = index + 2;

    if (!title || !(start instanceof Date) || !(end instanceof Date) || start >= end) {
      console.log(JSON.stringify({ row: rowNumber, status: 'INVALID_INPUT' }));
      return;
    }

    const key = [title, start.getTime(), end.getTime()].join('|');
    const duplicateInSheet = seen.has(key);
    seen.add(key);

    const duplicateInCalendar = calendar.getEvents(start, end)
      .some(event => event.getTitle().trim() === title &&
        event.getStartTime().getTime() === start.getTime() &&
        event.getEndTime().getTime() === end.getTime());

    console.log(JSON.stringify({
      row: rowNumber,
      status: duplicateInSheet || duplicateInCalendar ? 'DUPLICATE_CANDIDATE' : 'OK',
      dryRun: DRY_RUN
    }));
  });
}

実行手順

1. 対象シートの「拡張機能」からApps Scriptを開きます。

2. コードを貼り付けて保存し、`auditCalendarDuplicatePlanFree`を選びます。

3. テスト用カレンダーと少量の候補で権限を確認して実行します。

4. 実行ログの`INVALID_INPUT`と`DUPLICATE_CANDIDATE`を確認します。

5. 実データへ進む前に、候補行と既存予定を人が照合します。

失敗しやすい点と停止条件

  • タイムゾーンや秒・ミリ秒の差があると、見た目が同じ予定でも一致しない場合があります。
  • 繰り返し予定や終日予定は、この最小例の対象外です。
  • 50件を超えたら停止します。期間を分けて監査してください。
  • ログにはタイトルや参加者、説明を出しません。個人情報をログへ残さないためです。
  • このコードは検出専用です。結果を確認せず、予定の自動作成や自動削除へ変更しないでください。

まとめ

予定を登録する前に、入力不備、シート内重複、カレンダー上の完全一致候補をdry-runで確認できます。まずは検出だけに絞り、実行ログを人が確認する運用から始めると安全です。

朝の予定・タスク確認を仕組み化する有料Tipsを見る

GasおじのTips商品一覧を見る

※学習・検証用の例です。実データへ適用する前にコピー環境で確認してください。Google公式・Google公認の商品ではありません。


あなたも記事の投稿・販売を
始めてみませんか?

Tipsなら簡単に記事を販売できます!
登録無料で始められます!

Tipsなら、無料ですぐに記事の販売をはじめることができます Tipsの詳細はこちら
 

この記事のライター

ツールおじ|GoogleアカウントをAIエージェント化

おう、Gasおじだ。 AIツールとSaaSに散々突っ込んで遠回りした結果、最後に強かったのは「今あるGoogleアカウント」だった。 今ではAIエージェントであらゆるタスクを自動化して無双してるぞ。 GAS、スプレッドシート、フォーム、Gmail、AIエージェントを組み合わせれば、個人でも小さな会社でも、手作業だらけの業務はかなり自動化できる。 ここでは机上のAI論じゃなく、現場で動くテンプレ、コード、手順だけを置いていくぞ。 高いツールを増やす前に、まずお前さんのGoogleアカウントを仕事するエージェントに変えようじゃないか。

このライターが書いた他の記事

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    1 %獲得
    (29 円相当)
  • あとで見るURLを二重登録しない|GASで読書・動画ウォッチリストをdry-run監査

  • X投稿の重複を出す前に止める|GASで投稿キューをdry-run監査

関連のおすすめ記事

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    1 %獲得
    (29 円相当)
    ツールおじ|GoogleアカウントをAIエージェント化

    ツールおじ|GoogleアカウントをAIエージェント化

  • 【Python】 Con-Que 【データベース接続】

    ¥3,000
    1 %獲得
    (30 円相当)
    GoGorilla

    GoGorilla

  • USBメモリで持ち運べるLinux Mint 22.1と永続的な書き込み領域の作成法【Rufus だけで作成する方法を初心者向けに徹底解説】

    ¥500
    1 %獲得
    (5 円相当)
    SmartSenior

    SmartSenior