カスタムなカレンダーリマインダーをGASで作成

GASカレンダーリマインダー
カスタムなカレンダーリマインダーをGASで作成のサムネイル

カスタムなカレンダーリマインダーをGASで作成


こんにちは、GASおじです。Googleカレンダーの標準通知だけでは「毎朝、24時間以内の予定を一覧で確認したい」といった運用に合わせにくいことがあるよね。この記事では、Google Apps Script(GAS)でデフォルトカレンダーの予定を読み取り、指定したメールアドレスへ一覧を送るリマインダーを作る。

この仕組みはカレンダーの予定を変更・削除しない。読み取った予定をメール本文へ整形し、時間主導型トリガーで毎日実行する構成だ。ただし、メール本文には予定名・時刻・場所が含まれるため、通知先は必ず自分で管理できるアドレスを指定しよう。

このリマインダーが行うこと

今回のコードは、実行時刻から24時間以内に始まる予定をデフォルトカレンダーから取得する。予定が1件以上あれば、件数・予定名・開始終了時刻・場所を1通のメールにまとめて送信する。予定がなければメールは送らず、実行ログだけを残す。

公式のCalendarAppでは、利用者のデフォルトカレンダーへ直接アクセスする方法としてgetDefaultCalendar()が用意されている。メール送信には、受信箱へアクセスせず送信だけを行うMailAppを使う。毎日の自動実行はClockTriggerBuilderのatHour()everyDays()で設定する。

実装コード

Apps Scriptで新しいプロジェクトを作り、次のコードを貼り付ける。最初にCONFIG.recipientを自分の通知先メールアドレスへ変更してね。

const CONFIG = {
  recipient: 'your-email@example.com',
  lookAheadHours: 24,
};

function sendCustomCalendarReminder() {
  if (!CONFIG.recipient || CONFIG.recipient === 'your-email@example.com') {
    throw new Error('CONFIG.recipientを通知先メールアドレスへ変更してください。');
  }

  const now = new Date();
  const reminderEnd = new Date(
    now.getTime() + CONFIG.lookAheadHours * 60 * 60 * 1000,
  );
  const calendar = CalendarApp.getDefaultCalendar();
  const events = calendar.getEvents(now, reminderEnd);

  if (events.length === 0) {
    Logger.log(`${CONFIG.lookAheadHours}時間以内の予定はありません。`);
    return;
  }

  if (MailApp.getRemainingDailyQuota() < 1) {
    throw new Error('本日のメール送信可能件数が残っていません。');
  }

  const timeZone = Session.getScriptTimeZone();
  const eventBlocks = events.map((event) => {
    const start = Utilities.formatDate(
      event.getStartTime(),
      timeZone,
      'yyyy/MM/dd HH:mm',
    );
    const end = Utilities.formatDate(
      event.getEndTime(),
      timeZone,
      'yyyy/MM/dd HH:mm',
    );
    return [
      `予定: ${event.getTitle() || '(タイトルなし)'}`,
      `時間: ${start}〜${end}`,
      `場所: ${event.getLocation() || '未設定'}`,
    ].join('\n');
  });

  const subject =
    `【予定リマインダー】${CONFIG.lookAheadHours}時間以内の予定 ${events.length}件`;
  const body = [
    `${CONFIG.lookAheadHours}時間以内の予定をお知らせします。`,
    '',
    eventBlocks.join('\n\n'),
  ].join('\n');

  MailApp.sendEmail(CONFIG.recipient, subject, body);
  Logger.log(`予定リマインダーを${CONFIG.recipient}へ送信しました。`);
}

function createDailyReminderTrigger() {
  const functionName = 'sendCustomCalendarReminder';
  const triggerExists = ScriptApp.getProjectTriggers().some(
    (trigger) => trigger.getHandlerFunction() === functionName,
  );

  if (triggerExists) {
    Logger.log('既存のリマインダートリガーを確認しました。');
    return;
  }

  ScriptApp.newTrigger(functionName)
    .timeBased()
    .atHour(9)
    .everyDays(1)
    .create();
  Logger.log('毎日9時台のリマインダートリガーを作成しました。');
}

atHour(9)は9時ちょうどを保証する指定ではなく、スクリプトのタイムゾーンにおける9時台の実行指定だ。プロジェクト設定のタイムゾーンが利用地域と合っているかも確認しておこう。

初回実行と動作確認

いきなり自動化せず、次の順番で1回ずつ確認すると安全だ。

  1. CONFIG.recipientを自分のメールアドレスへ変更する。
  2. 24時間以内に確認用のカレンダー予定を1件作る。
  3. Apps Scriptの実行対象でsendCustomCalendarReminderを選び、手動実行する。
  4. 初回の権限確認で、カレンダーの読み取りとメール送信を許可する。
  5. メールの件名・予定名・時刻・場所が正しいことを確認する。
  6. 問題がなければcreateDailyReminderTriggerを1回だけ実行する。

トリガー作成関数は、同じ実行関数のトリガーがすでにある場合に追加作成を止める。そのため、誤って複数回実行しても同じ通知トリガーが増えにくい構成だ。通知時刻や対象時間を変える場合は、atHour(9)またはlookAheadHoursを変更する。

権限・上限・停止方法

このコードは、カレンダー予定の読み取り、メール送信、インストール型トリガーの作成権限を使う。MailAppには1日あたりの宛先数などの上限があり、上限値はアカウント種別で異なる。コードでは送信前に残り宛先数を確認するが、Apps Script全体の実行時間や各サービスの割り当ても運用前に確認してほしい。

停止したい場合は、Apps Scriptの「トリガー」画面でsendCustomCalendarReminderの時間主導型トリガーを確認し、対象を手動で削除する。コード自体はカレンダーの予定を更新・削除しないので、停止時に予定を復元する作業は不要だ。

予定の機密性にも注意しよう。共有アドレスや転送設定のあるアドレスへ送ると、予定情報が意図しない相手へ届く可能性がある。まず自分宛てのテスト予定で確認し、必要最小限の情報だけをメールへ含めるのがおすすめだよ。


これで「予定一覧を作るだけ」ではなく、24時間以内の予定を実際にメールで知らせるカスタムリマインダーとして動く。Googleアカウントの利用枠内で始められるけれど、専用サービスとの費用比較では設定・保守の時間やApps Scriptの上限も含めて判断しよう。

もっと便利なGASツールを使いたいなら、こちらのメンバーシップも覗いてみてね。

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