カレンダー予定のCSV漏れを保存前に発見|GASでイベントをdry-run確認

カレンダー予定のCSV漏れを保存前に発見|GASでイベントをdry-run確認

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

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

Googleカレンダーの予定をCSVへ控えたいとき、期間や項目の指定が曖昧だと、必要な予定が抜けたり想定外の件数になったりします。この記事では、ファイルを作成する前にイベント件数とCSV予定行を確認する、無料のGAS例を紹介します。予定の作成・変更・削除やDriveへの保存は行いません。

先に知っておきたいこと

  • `DRY_RUN = true` を固定し、カレンダーとDriveを変更しません。
  • 対象期間は最大31日、イベントは最大500件で停止します。
  • 説明、参加者、会議URLは取得・出力しません。
  • 終日予定と時刻付き予定を区別してCSV予定行を作ります。

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

const DRY_RUN = true;
const CALENDAR_ID = 'primary';
const START_DATE = '2026-09-01';
const END_DATE = '2026-09-08';
const MAX_EVENTS = 500;

function auditCalendarEventExportCsvFree() {
  if (DRY_RUN !== true) throw new Error('安全のためDRY_RUN=trueで実行してください');
  const start = parseDate_(START_DATE);
  const end = parseDate_(END_DATE);
  if (end <= start) throw new Error('END_DATEはSTART_DATEより後にしてください');
  const days = (end - start) / 86400000;
  if (days > 31) throw new Error('対象期間は31日以内にしてください');
  if (MAX_EVENTS < 1 || MAX_EVENTS > 500) throw new Error('MAX_EVENTSは1〜500にしてください');

  const calendar = CalendarApp.getCalendarById(String(CALENDAR_ID).trim());
  if (!calendar) throw new Error('カレンダーを確認できません。IDと権限を見直してください');
  const events = calendar.getEvents(start, end);
  if (events.length > MAX_EVENTS) throw new Error('イベントが上限を超えました。期間を短くしてください');

  const rows = [['title', 'start', 'end', 'allDay']];
  events.forEach(event => rows.push([
    sanitizeCsv_(event.getTitle()),
    event.isAllDayEvent() ? formatDate_(event.getAllDayStartDate()) : event.getStartTime().toISOString(),
    event.isAllDayEvent() ? formatDate_(event.getAllDayEndDate()) : event.getEndTime().toISOString(),
    String(event.isAllDayEvent())
  ]));
  console.log(JSON.stringify({ dryRun: DRY_RUN, eventCount: events.length, sampleRows: rows.slice(0, 6) }));
}

function parseDate_(value) {
  if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) throw new Error('日付はYYYY-MM-DDで入力してください');
  const date = new Date(value + 'T00:00:00');
  if (Number.isNaN(date.getTime())) throw new Error('日付を解釈できません');
  return date;
}

function formatDate_(date) {
  return Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy-MM-dd');
}

function sanitizeCsv_(value) {
  const text = String(value || '').replace(/[\r\n]+/g, ' ').trim();
  return /^[=+\-@]/.test(text) ? "'" + text : text;
}

実行手順

1. Apps Scriptへコードを貼り付け、プロジェクトのタイムゾーンを確認します。

2. `START_DATE` と `END_DATE` を短い検証期間へ変更します。

3. 必要なら `CALENDAR_ID` を自分が閲覧できるカレンダーIDへ変更します。

4. `auditCalendarEventExportCsvFree` を実行し、権限を確認します。

5. 実行ログの件数と先頭5行だけを確認し、CSV保存は別工程で人が判断します。

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

  • 日付形式が不正、終了日が開始日以前、期間が31日超なら停止します。
  • イベントが500件を超えた場合は停止し、期間を短くします。
  • タイムゾーン設定により時刻表示が変わります。プロジェクト設定を先に確認してください。
  • タイトルにはCSV数式として解釈されやすい先頭文字を無害化しますが、個人情報を含む予定名は出力しないでください。
  • このコードはCSVファイルを作成せず、予定も変更しません。

公開前チェックリスト

  • 予定を作成・変更・削除していない
  • Driveへファイルを保存していない
  • 説明、参加者、会議URLを取得していない
  • 期間と件数に停止条件がある
  • 少量期間のログで確認した

まとめ

カレンダーのCSV化は、保存より先に期間・件数・列の形を確認すると漏れや過剰取得を防ぎやすくなります。まずは変更を加えないdry-runで予定行を確認し、必要な範囲だけに絞ってから保存工程を検討してください。

毎朝のToDoを区分・優先度・期限つきでまとめる Morning ToDo Mail Proを見る

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

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


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

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

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

この記事のライター

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

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

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

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

    ¥2,980
    1 %獲得
    (29 円相当)
  • GASのtry-catch入門|元データを守るエラー処理とログの実装例

  • あとで見るURLを二重登録しない|GASで読書・動画ウォッチリストをdry-run監査

関連のおすすめ記事

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

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

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

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

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

    GoGorilla

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

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

    SmartSenior