イベントのゲストにリマインドメールを自動送信する Googleカレンダーアプリ④

予定のうっかり忘れを防ぐにはリマインドする(思い出させる、念押しする)ことが大切ですね。
そのためによく用いられるのが、リマインドメールです。
イベントの期日が近づいてきたタイミングでリマインドメールを送って、ゲストに予定があることを思い出してもらう。

ただこれも、常にイベントの日時を把握して、何日前になったかをいつも気にして、毎回手動で送るとなるとなかなか煩雑です。
それこそ、うっかり忘れそうです。
指定した日時に誰かがリマインドメールを送ってくれたら、この煩雑さから解放されるのですが。
そんな誰かはいるでしょうか?
はい、います!
それはGASです!しかもGASなら、送り忘れがない上、タダでやってくれます(笑)

今回は、イベントの2日前になったら、欠席以外のゲストにリマインドメールを送信するアプリ sendRemindMailForTwoDaysAfterEvent関数をGASで作っていきましょう。

完成コード

まずは完成コードです。
10行目の「自分のメールアドレス」を通知用のメールアドレスに書き換え、Apps Scriptにコピペすればすぐに使えます。
メールのタイトル、本文は自由にアレンジしてください。

コードは大まかに2つのパートから成っています。
1. カレンダーからイベントを取得するパート
2. 各イベントから情報を取得し、メールに成形して送信するパート
詳しく学びたい方は、以下のコード解説も続けてご覧ください。

// イベントの2日前に欠席以外のゲストにリマインドメールを送るアプリ
function sendRemindMailForTwoDaysAfterEvent() {
  const calendar = CalendarApp.getDefaultCalendar(); // カレンダーの取得
  const twoDaysAfter = new Date();
  twoDaysAfter.setDate(twoDaysAfter.getDate() + 2); // 2日後の日付設定
  const events = calendar.getEventsForDay(twoDaysAfter); // 2日後の全イベントを取得

  if (events.length == 0) { // 2日後にイベントがない時の処理
    MailApp.sendEmail(
      '自分のメールアドレス',
      '【2日後の予定はありません】',
      'リマインドメールのトリガーが発動しました。2日後の予定はありません');
  } else { // 2日後にイベントがある時の処理
    for (const event of events){ // 全イベントを1つずつループ
      const title = event.getTitle(); // イベントタイトル
      let date = event.getStartTime(); // イベント開始日時を取得してフォーマティング
      date = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy年M月d日 H時m分〜');
      const location = event.getLocation(); // イベントの場所
      const description = event.getDescription(); // イベントの説明
      const guests = event.getGuestList(true); // ゲストリスト

      for (const guest of guests) { // ゲストを1人ずつループ
        const status = guest.getGuestStatus(); // ゲストのステータス
        if (status == 'NO'){ // ステータスが欠席の場合はスキップ
          continue;
        }
        const email = guest.getEmail(); // ゲストのメールアドレス
        const subject = `【2日前リマインドメール】${title}`; // メールのタイトル
        const body = `下記予定の2日前となりましたので、ご確認願います。
        ・予定名:${title}
        ・開催日時:${date}
        ・場所:${location}
        ・詳細:${description}
        *出欠連絡は忘れていませんか?`;

        MailApp.sendEmail(email, subject, body);
      }
    }
  }
}

コード解説

twoDaysAfter.setDate(twoDaysAfter.getDate( ) + 2 )

イベントの2日前にリマインドするということは、2日後のイベントを対象とすればよいわけです。
そのためにまず、2日後を設定します。
新しいDateオブジェクト作り、変数twoDaysAfterに格納します。
getDate( )で取り出した日付に +2してsetDate( )すればOKです。

リマインドする日を3日前、前日などに変えたい場合には、2を3や1に変えればよいだけです。

calendar.getEventsForDay(twoDaysAfter)

カレンダーからイベントを取得するため、指定した日の全てのイベントを取得するgetEventsForDay( )メソッドを使います。
引数にtwoDaysAfterを渡します。
公式リファレンス

if else文でイベントのない時とある時の処理を分ける

イベントがなければリマインドメールが送られないだけで、特にない時の処理はなくても問題はないのですが、
カレンダーのオーナーにとっては、イベントがないことを知ることもちょっとした安心材料になったりします。
また、リマインドメールを送るためのトリガーは毎日作動しますので、イベントがなくても通知してくれるようにプログラミングしておくことで、
トリガーがエラーなく作動しているかどうかを確認する手がかりとなります。

events.length == 0 の条件がtrueの時には、自分宛に「2日後の予定はない」旨のメールを送ります。
falseの時(イベントがある時)には、else以下の処理を行います。
lengthプロパティは配列の要素数を取得できます。

MailApp.sendEmail( )については後述。

for…of

for…ofはJavaScriptの構文です。参照
他の記事でも触れていますが、GASはJavaScriptベースの言語ですので、JavaScriptの基本的な構文を利用可能です。
for…ofは配列の複数の要素を1つずつ取り出して処理を行う時に便利です。

今回は、for (const event of events)とfor (const guest of guests)の2カ所で使っています。

CalendarEventクラスのメソッド

getEventsForDay( )の戻り値であるCalendarEventクラスのメソッド一覧はこちらです。

getTitle( )、getStartTime( )、getLocation( )、getDescription( )、getGuestList(true)の各メソッドを使ってeventから情報を取得し、
それぞれの変数に格納します。

getStartTime( )はプレーンだと「Mon May 8 15:00:00 GMT+09:00 2023」のような表記で読みにくいため、
Utilities.formatDate( )を使って、「2023年5月8日 15時0分〜」のように読みやすく成形しています。参照

getGuestList(true)は、引数をtrueとすることで、ゲストリストにオーナーも含めることができます。
オーナー自身にもリマインドメールを送りたい時には、trueとしましょう。参照

欠席者はリマインドから除外する

イベントの招待メールを受けたゲストは、参加・いいえ・未定の各ボタンから返答することができます。
そして、その返答内容はカレンダーに図のように反映されます。

「いいえ」で不参加を伝え済みの人にリマインドメールを送ってしまうと、要らぬ混乱を招きかねません。失礼にもならないように、欠席者はリマインドの対象から除外すべきでしょう。

そのためには、各ゲストの返答内容を知る必要があり、それを取得できるのが、getGuestStatus( )です。
ゲストのステータスは5種類あります。参照

status == 'NO’の場合は、continueで続くメール送信の処理をスキップします。

前後しましたが、getGuestList( )の戻り値であるEventGuestクラスのメソッド一覧はこちらです

MailApp.sendEmail(email, subject, body)

メールを送信するメソッドです。

すでに見たように、今回は「2日後にイベントがない時の通知」にも同じメソッドを使っています。
その時は(9〜12行目)、送信先は固定で、メールのサブジェクト、本文はシンプルなものでよいので、変数には入れず直書きしました。

対して、リマインドメールの方は送信先は変わりますし、本文もやや複雑になるので、それらを変数に格納し、subject、bodyはバッククォート( ` )で囲むテンプレートリテラルを使っています。

MailApp.sendEmail( )については、下の記事も参考になります。

トリガーの設定

sendRemindMailForTwoDaysAfterEvent関数を毎日走らせるためにトリガーを設定します。
「時間主導型」で「日付ベースのタイマー」を選択します。
「時刻」はお好みでどうぞ。

保存すれば、あとは毎日、選択した時刻にメールが届きます。
2日後の予定があればリマインドメールが、なければ「予定はありません」メールが届きます。
何もメールが届かなければ、トリガーのエラーはないか確認してみましょう。

トリガーの設定についてはこちらも参考になります。

シリーズ目次:Googleカレンダーアプリ①〜④

  1. スプレッドシートからGoogleカレンダーに予定を登録する Googleカレンダーアプリ①
  2. イベントの招待メールを一括送信する Googleカレンダーアプリ②
  3. 定期イベントをカレンダーに登録する Googleカレンダーアプリ③
  4. イベントのゲストにリマインドメールを自動送信する Googleカレンダーアプリ④

GASGカレンダー

Posted by botw