みなさん、こんにちは!うえはら(@tifoso_str)です。
今回のシリーズでは、Google Apps ScriptでGoogleカレンダーで予定が更新されたときに、チャットワークへ通知することをお伝えしています。
ちょっと全容がわからないので、最終目標を「1ヶ月以内のイベントが更新されたときに、下記のようなメッセージを送る」ことにしたいと思います。
『「カレンダー名」のカレンダーで「日付」の予定「イベント名」が更新されました。』
前回の内容で、カレンダー名は取得できるようになりました。
その中で出てきたイベントオブジェクトで、更新されたイベントを取得できれば日付もイベント名も取得できて無事終了だったのですが、残念ながらそうではないので、少し工夫が必要です。
更新されたイベントを特定する手段
まず前提として、現在より1ヶ月先の間で更新されたイベントのみ通知することにします。
そこで、1ヶ月分のイベントを取り出して、イベントごとの更新日時を取得します。
トリガーはイベントが更新されたときに実行されるので、取得したイベントの一番新しい更新日時とトリガーで関数が実行された時間が10秒以内であれば、そのイベントが送信されたものとします。
10秒以内に作成と別なイベントの削除を行うとうまく機能しませんが、一般的ではないので考慮しないこととします。
今回はGoogle Apps Scriptでトリガーが実行された時から1ヶ月以内のイベントを取り出し、各イベントの日時、イベント名、更新日時を配列に入れる部分を解説します。
トリガーが実行された時から1ヶ月以内のイベントを取り出す
まずは、トリガーが実行された時から1ヶ月以内のイベントを取り出すスクリプトです。
function Calendar(e) { var calendarId = e.calendarId; var startDate = new Date(); //関数が実行された日時 var endDate = new Date(); endDate.setMonth(endDate.getMonth() + 1); //1ヵ月後の日時 var events = CalendarApp.getCalendarById(calendarId).getEvents(startDate, endDate); }
特定期間のイベントを取得するにはgetEventsメソッドを使用します。
今回でいえば、開始日時は関数が実行された日時、終了日時は1ヵ月後の日時です。
1ヶ月後の日時は、関数が実行された日時からgetMonthメソッドで月を取り出し、その月に+1した値を、setMonthメソッドで設定します。
Dateオブジェクトについてはこちらの記事もご確認下さい。
各イベントから日付、タイトル、更新日時を取り出す
各イベントから日付、タイトル、更新日時を取り出すには、getStartTimeメソッド、getTitleメソッド、getLastUpDateメソッドをそれぞれ使用します。
Eventオブジェクト.getTitle()
Eventオブジェクト.getLastUpDate()
Eventオブジェクトは配列になっているので、角括弧で配列の要素番号を指定して取り出します。
各イベントの日付、タイトル、更新日時を配列に入れる
1ヵ月分のイベントを取り出す部分と併せると下記のようになります。
function Calendar(e) { var calendarId = e.calendarId; var startDate = new Date(); var endDate = new Date(); endDate.setMonth(endDate.getMonth() + 1);//1ヵ月後の日時 var events = CalendarApp.getCalendarById(calendarId).getEvents(startDate, endDate); var arrDate = [];//日付用の配列 var arrTitle = [];//イベント名の配列 var arrUpDate = [];//更新日時の配列 for (var i = 0;i<events.length;i++){ arrDate.push(events[i].getStartTime()); arrTitle.push(events[i].getTitle()); arrUpDate.push(events[i].getLastUpdated().getTime()); //更新日時をミリ秒に変換して配列追加 } Logger.log('日付の配列\n' + arrDate + '\n'); Logger.log('イベント名の配列\n' + arrTitle + '\n'); Logger.log('更新日時の配列\n' + arrUpDate); }
はじめに配列用の変数を作成し、for文でイベントの数だけ繰り返し配列に追加します。
配列の最後に要素を追加する場合は、Arrayオブジェクトに対するpushメソッドを使います。
更新日時は後で比較するときにミリ秒の方が都合がいいので、getTimeメソッドでミリ秒に変換して配列に入れます。
イベントを更新してログを確認すると下記のように各イベントの日時とイベント名、更新日時が確認できます。
まとめ
今回は、Google Apps Scriptでトリガーが実行された時から1ヶ月以内のGoogleカレンダーのイベントを取り出し、各イベントの日時とイベント名、更新日時をそれぞれの配列に入れるところまでを解説しました。
期間は自分で調整できるので、1週間以内でよければ、下記のように変更すればいいですね。
var startDate = new Date(); var endDate= new Date(); endDate.setDate(endDate.getDate() + 7);
次回は更新日時の配列から一番新しい(現在に近い)更新日時を取り出してチャットワークへ送信したいと思います。