カスタムなカレンダーリマインダーをGASで作成
こんにちは、GASおじです。Googleカレンダーの標準通知だけでは「毎朝、24時間以内の予定を一覧で確認したい」といった運用に合わせにくいことがあるよね。この記事では、Google Apps Script(GAS)でデフォルトカレンダーの予定を読み取り、指定したメールアドレスへ一覧を送るリマインダーを作る。
この仕組みはカレンダーの予定を変更・削除しない。読み取った予定をメール本文へ整形し、時間主導型トリガーで毎日実行する構成だ。ただし、メール本文には予定名・時刻・場所が含まれるため、通知先は必ず自分で管理できるアドレスを指定しよう。
■ このリマインダーが行うこと
今回のコードは、実行時刻から24時間以内に始まる予定をデフォルトカレンダーから取得する。予定が1件以上あれば、件数・予定名・開始終了時刻・場所を1通のメールにまとめて送信する。予定がなければメールは送らず、実行ログだけを残す。
公式のCalendarAppでは、利用者のデフォルトカレンダーへ直接アクセスする方法としてgetDefaultCalendar()が用意されている。メール送信には、受信箱へアクセスせず送信だけを行うMailAppを使う。毎日の自動実行はClockTriggerBuilderのatHour()とeveryDays()で設定する。
・CalendarApp公式リファレンス
・MailApp公式リファレンス
・ClockTriggerBuilder公式リファレンス
■ 実装コード
Apps Scriptで新しいプロジェクトを作り、次のコードを貼り付ける。最初にCONFIG.recipientを自分の通知先メールアドレスへ変更してね。
const CONFIG = {
recipient: 'YOUR_NOTIFICATION_ADDRESS',
lookAheadHours: 24,
};
function sendCustomCalendarReminder() {
if (!CONFIG.recipient || CONFIG.recipient === 'YOUR_NOTIFICATION_ADDRESS') {
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回ずつ確認すると安全だ。
・CONFIG.recipientを自分のメールアドレスへ変更する。
・24時間以内に確認用のカレンダー予定を1件作る。
・Apps Scriptの実行対象でsendCustomCalendarReminderを選び、手動実行する。
・初回の権限確認で、カレンダーの読み取りとメール送信を許可する。
・メールの件名・予定名・時刻・場所が正しいことを確認する。
・問題がなければcreateDailyReminderTriggerを1回だけ実行する。
トリガー作成関数は、同じ実行関数のトリガーがすでにある場合に追加作成を止める。そのため、誤って複数回実行しても同じ通知トリガーが増えにくい構成だ。通知時刻や対象時間を変える場合は、atHour(9)またはlookAheadHoursを変更する。
■ 権限・上限・停止方法
このコードは、カレンダー予定の読み取り、メール送信、インストール型トリガーの作成権限を使う。MailAppには1日あたりの宛先数などの上限があり、上限値はアカウント種別で異なる。コードでは送信前に残り宛先数を確認するが、Apps Script全体の実行時間や各サービスの割り当ても運用前に確認してほしい。
停止したい場合は、Apps Scriptの「トリガー」画面でsendCustomCalendarReminderの時間主導型トリガーを確認し、対象を手動で削除する。コード自体はカレンダーの予定を更新・削除しないので、停止時に予定を復元する作業は不要だ。
予定の機密性にも注意しよう。共有アドレスや転送設定のあるアドレスへ送ると、予定情報が意図しない相手へ届く可能性がある。まず自分宛てのテスト予定で確認し、必要最小限の情報だけをメールへ含めるのがおすすめだよ。
これで「予定一覧を作るだけ」ではなく、24時間以内の予定を実際にメールで知らせるカスタムリマインダーとして動く。Googleアカウントの利用枠内で始められるけれど、専用サービスとの費用比較では設定・保守の時間やApps Scriptの上限も含めて判断しよう。
■ GASの相談や導入サポートを見たい方へ
この記事と近い作業をGoogleシートやGASで整えたい方は、Gasおじのココナラ出品一覧もご覧ください。
■ 関連サービス
GASおじのココナラ出品一覧
日々の記録、確認、通知、投稿準備などを、GoogleスプレッドシートとGASで無理なく自動化する相談ができます。