GASでGoogleカレンダーが更新されると1ヶ月以内のイベントを取り出す


カレンダー

みなさん、こんにちは!うえはら(@tifoso_str)です。

今回のシリーズでは、Google Apps ScriptでGoogleカレンダーで予定が更新されたときに、チャットワークへ通知することをお伝えしています。

ちょっと全容がわからないので、最終目標を「1ヶ月以内のイベントが更新されたときに、下記のようなメッセージを送る」ことにしたいと思います。

【送信メッセージ】
『「カレンダー名」のカレンダーで「日付」の予定「イベント名」が更新されました。』

前回の内容で、カレンダー名は取得できるようになりました。

複数のGoogleカレンダー更新に対応するトリガー設定とスクリプト
トリガーが実行されると引数が渡されます。その中からカレンダーIDを取り出し、どのカレンダーが更新されたのか特定します。カレンダーIDが分かれば、カレンダー名も取得できるので、カレンダー名をチャットワークへ送信します。

その中で出てきたイベントオブジェクトで、更新されたイベントを取得できれば日付イベント名も取得できて無事終了だったのですが、残念ながらそうではないので、少し工夫が必要です。

スポンサーリンク

更新されたイベントを特定する手段

まず前提として、現在より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メソッドを使用します。

Calendarオブジェクト.getEvents(開始日時, 終了日時)

今回でいえば、開始日時は関数が実行された日時、終了日時は1ヵ月後の日時です。

1ヶ月後の日時は、関数が実行された日時からgetMonthメソッドで月を取り出し、その月に+1した値を、setMonthメソッドで設定します。

Dateオブジェクトについてはこちらの記事もご確認下さい。

Google Apps ScriptでのDateオブジェクトの各生成方法、日付と時刻を分ける
スプレッドシートの勤怠管理システムをお題としてGoogle Apps Scriptでの日時について解説します。Dateオブジェクトの生成のいくつかの種類、要素を取得するメソッド、日付と時刻の分解などです。

各イベントから日付、タイトル、更新日時を取り出す

各イベントから日付、タイトル、更新日時を取り出すには、getStartTimeメソッドgetTitleメソッドgetLastUpDateメソッドをそれぞれ使用します。

Eventオブジェクト.getStartTime()
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メソッドを使います。

Arrayオブジェクト.push(要素)

更新日時は後で比較するときにミリ秒の方が都合がいいので、getTimeメソッドでミリ秒に変換して配列に入れます。

イベントを更新してログを確認すると下記のように各イベントの日時とイベント名、更新日時が確認できます。

各イベント情報の配列

まとめ

今回は、Google Apps Scriptでトリガーが実行された時から1ヶ月以内のGoogleカレンダーのイベントを取り出し、各イベントの日時とイベント名、更新日時をそれぞれの配列に入れるところまでを解説しました。

期間は自分で調整できるので、1週間以内でよければ、下記のように変更すればいいですね。

  var startDate = new Date();
  var endDate= new Date();
  endDate.setDate(endDate.getDate() + 7);

次回は更新日時の配列から一番新しい(現在に近い)更新日時を取り出してチャットワークへ送信したいと思います。

連載目次:GASでカレンダーイベントをトリガーにする方法

GASのイベントトリガーとして新たに加わった「カレンダーの更新」を使用すれば、カレンダーの操作をきっかけにスクリプトを動作させることができます。このシリーズでは、カレンダーの更新トリガーの基本の使い方から、一歩進んだテクニックをお伝えしていきます。
  1. Googleカレンダーで予定が更新された時にチャットワークに通知する
  2. 複数のGoogleカレンダー更新に対応するトリガー設定とスクリプト
  3. GASでGoogleカレンダーが更新されると1ヶ月以内のイベントを取り出す
  4. GASでGoogleカレンダーが更新された時にイベントを特定してチャットワークへ送信

タイトルとURLをコピーしました