GASで今日の予定を毎朝自動でメール通知する方法

GASで今日の予定を毎朝自動でメール通知する方法

毎朝出社してから、その日の予定をカレンダーで確認してから一日を始めている人は多いはずです。

確認そのものは数十秒の作業でも、来客対応や電話が重なる朝は後回しになり、気づいたら最初の予定に遅れかけていたということも起こります。

複数のカレンダーを使い分けている場合は、確認する画面がひとつでは済まなくなり、見落としの原因にもなります。

この記事ではGoogle Apps Scriptで今日の予定を毎朝メールで自動通知する仕組みを、複数カレンダーをまとめる方法まで整理しています。

今日の予定の自動通知を無料で相談する

完成イメージと仕組み

完成すると、毎朝決まった時刻に、その日カレンダーへ登録されている予定の一覧がメールで届くようになります。

仕組みとしては、スクリプトが実行時点の日付を基準にGoogleカレンダーからその日の予定をすべて取得し、開始時刻順の一覧を組み立ててメール本文に流し込みます。

時間主導型トリガーで毎朝自動実行するように設定しておけば、カレンダーのアプリを開かなくても、受信トレイを見るだけでその日の予定を把握できる状態になります。

手順

コードを貼り付けてからトリガーを設定するまで、3つのステップで完成します。

Step1. 通知先のメールアドレスを確認する

特別な準備は必要なく、通知を受け取りたいメールアドレスを確認しておくだけで進められます。

自分のGmailアドレスでも、部署で共有しているメーリングリストのアドレスでも構いません。

複数人へ届けたい場合は、次のステップで貼り付けるコードの中で受信者を配列にして複数件指定することもできます。

Step2. コードを貼り付ける(コード全文)

スプレッドシート上部のメニューから拡張機能を開き、Google Apps Scriptを選ぶとスクリプトエディタが立ち上がります。

表示されているコードを全て消し、次のコードを貼り付けます。

function sendTodayAgendaEmail() {
  const recipientEmail = 'your-address@example.com'; // ★ここを変える: 通知を受け取るメールアドレス
  const timeZone = 'Asia/Tokyo';
  const today = new Date();

  const calendar = CalendarApp.getDefaultCalendar();
  const events = calendar.getEventsForDay(today);
  const dateLabel = Utilities.formatDate(today, timeZone, 'M月d日');

  if (events.length === 0) {
    GmailApp.sendEmail(recipientEmail, `【今日の予定】${dateLabel}は登録なし`, '本日登録されている予定はありません。');
    return;
  }

  const agendaLines = events.map((event) => {
    const startTime = Utilities.formatDate(event.getStartTime(), timeZone, 'HH:mm');
    const endTime = Utilities.formatDate(event.getEndTime(), timeZone, 'HH:mm');
    return `${startTime}〜${endTime} ${event.getTitle()}`;
  });

  const subject = `【今日の予定】${dateLabel}は${events.length}件`;
  const body = agendaLines.join('\n');
  GmailApp.sendEmail(recipientEmail, subject, body);
}

calendar.getEventsForDay(today) が実行された日のカレンダーから、その日に登録されている予定をまとめて取得します。

予定が1件もない日は早めに return して、予定がない旨だけを伝える短いメールを送り、それ以降の処理を行いません。

予定がある日は events.map で1件ずつ開始時刻・終了時刻・タイトルを並べた文字列に変換します。

その配列を join('\n') で改行区切りの本文にまとめ、GmailApp.sendEmail で送信します。

Step3. 時間主導型トリガーを設定してテストする

スクリプトエディタ左側の時計マークから、トリガーを追加する画面を開きます。

実行する関数は sendTodayAgendaEmail を選び、イベントのソースを時間主導型、時間ベースのトリガーのタイプを日付ベースのタイマーに設定して、通知を届けたい時間帯を選びます。

保存する前に、一度スクリプトエディタの実行ボタンを押して手動で動かし、指定したメールアドレスへ今日の予定がテスト配信されるかを確認しておきます。

初回実行時は権限の承認画面が表示されるため、内容を確認して許可を進めてください。

GASで今日の予定を毎朝メール通知する設定手順の3ステップ。通知先を確認→コードを貼り付け→トリガーを設定

通知そのものだけでなく、期限が近づいたタイミングで担当者に思い出させたい場合は、リマインダー送信の仕組みも参考になります。

複数カレンダーをまとめる方法

仕事用と共有用など、複数のカレンダーを並行して使っている場合、既定のカレンダーだけを取得する設定では一部の予定が通知から漏れてしまいます。

このようなときは、通知したいカレンダーを配列にまとめて、それぞれの予定をあわせて取得する形に書き換えます。

カレンダーの種類

取得に使うコード

IDの確認場所

自分のメインカレンダー

CalendarApp.getDefaultCalendar()

Googleカレンダーの設定画面

社内の共有カレンダー

CalendarApp.getCalendarById('カレンダーID')

対象カレンダーの設定と共有

他の担当者が共有しているカレンダー

CalendarApp.getCalendarById('メールアドレス')

共有された通知メール内のリンク

const calendars = [
  CalendarApp.getDefaultCalendar(),
  CalendarApp.getCalendarById('shared-calendar-id@group.calendar.google.com'),
];

const allEvents = calendars.flatMap((calendar) => calendar.getEventsForDay(today));

allEvents.sort((a, b) => a.getStartTime().getTime() - b.getStartTime().getTime());

複数のカレンダーから取得した予定は、取得したカレンダーの順にまとまって並ぶため、そのままでは時刻順になりません。

allEvents.sort で開始時刻を基準に並べ替えてから、Step2の agendaLines を組み立てる処理に渡せば、複数カレンダー分の予定を時刻順で1通のメールにまとめられます。

逆にスプレッドシートの予定表からカレンダーへまとめて登録したい場合は、次の記事の手順が参考になります。


Google Apps Scriptでの予定通知について相談してみませんか。

「複数の担当者のカレンダーをどうまとめればいいか分からない」「通知の内容を業務に合わせて出し分けたい」「社内にGoogle Apps Scriptを設計できる人材がいない」。

少しでも心当たりがあれば、お気軽にご相談ください。

現在、Google Apps Scriptを使った業務自動化のお悩みをお伺いする 無料の個別相談 を実施しています。


よくある質問

Q. 終日の予定も通知に含まれますか。

含まれます。

ただし終日の予定は開始時刻が日付の00:00として扱われるため、時刻順に並べると一覧の先頭に表示されます。

event.isAllDayEvent() で終日の予定かどうかを判定し、時刻の代わりに終日という表示に置き換えることもできます。

Q. 予定がない日にも通知メールは届きますか。

Step2のコードのままだと、予定がない旨を伝える短いメールが届きます。

予定がない日は通知そのものを送りたくない場合、events.length === 0 の分岐内にある GmailApp.sendEmail を削除してください。

代わりに何もせず return するだけの処理に書き換えれば、予定がある日だけメールが届く動きになります。

Q. 会議の参加者も通知メールに含められますか。

含められます。

event.getGuestList() で参加者の一覧を取得できるため、agendaLines を組み立てる処理の中で参加者名を連結すれば、誰が出席する予定かも通知に含められます。

Q. 1日に送信できるメールの件数に上限はありますか。

Gmailの送信件数にはGoogleアカウントの種類ごとに1日あたりの上限が設定されています。

このスクリプトは1日1回の送信を想定しているため通常は問題になりませんが、正確な上限値はGoogle公式のドキュメントで最新の値を確認してください。