【GAS】getEventsメソッドを完全マスター

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
icon_for_CalendarApp_ getEvents

条件に一致するカレンダーイベントを一括で取得するメソッド — getEvents

今回は既に作成済みの複数の予定を日付や作成者等の条件に従って一度に取得するgetEventsメソッドの説明をしたいと思います。今回のコードではGoogle Apps Script特有の特徴を学ぶ事ができます。

Google Apps Scriptは以前は処理速度が遅いと言った声や処理の上限時間が短いと言った言葉がネット上でも散見されましたが、殆どの場合はコードの書き方に問題がありました。大量の予定を一つずつシステムで取得してしまうと処理速度は遅くなってしまう可能性がありますが、そのような場合には今回ご紹介するような一気にデータを取得できるようなメソッドを利用してみましょう。100件あっても200件あっても1度の処理でデータを取得できますので、Google Apps Sriptを使う上ではこのような処理を極力行うようにすることを必ず頭に入れておきましょう。

それでは、早速今回のメソッドの説明を行います。

  1. getEvents(startTime, endTime)
  2. getEvents(startTime, endTime, options)
  3. getEventsForDay(date)
  4. getEventsForDay(date, options)

『 引数に入れる値 』

  • startTime (開始時間の条件)— 日付オブジェクト
  • endTime(終了時間の条件) — 日付オブジェクト
  • date (日付の条件)— 日付オブジェクト
  • options (詳細設定)— JSONオブジェクト
    • start — 条件に一致する予定が複数ある場合に、何個目からスタートするかを指定(整数)
    • max — 条件に一致する予定が複数ある場合に、取得する予定の最大数を指定(整数)
    • author — 予定の作成者を指定(文字列)
    • search — 含まれる文字列を指定(文字列)
    • statusFilters[] — 参加状況のを指定(配列)

getEvents(startTime, endTime)

サンプルコード1
//現在時刻から10日後の同時刻までの間に存在する予定をすべて取得して予定タイトルをログに表示するコード
function sampleCode1() {
  var startTime = new Date();
  var endTime = new Date(Date.parse(startTime) + (10 * 60 * 60 * 24 * 1000));
  var events = CalendarApp.getEvents(startTime, endTime);
  for (var i in events) {
    var title = events[i].getTitle();
    Logger.log(title);
  }
}

『 変数の説明 』

startTime = 現在の時刻を代入
endTime = 現在の時刻に10日間プラスした日付を代入
events = 条件にマッチする予定を配列で取得
title = 取得した予定の件名を順番に代入

スクリプトができたら▶ボタンでプログラムを実行してみましょう。実行が終了してからログを確認すると条件日にマッチする予定のタイトルがすべて取得できていると思います。
もし任意の日数に変更をしたい場合は、『10 * 60 * 60 * 24 * 1000』この部分の10という数字を任意の日数に変更してください。
この計算式ですが、日付オブジェクトは単純に足し算しただけでは取得した日数をプラスすることができません。そのため、現在時刻を一度数字に置き換えた後に、10日をミリ秒に換算した数字を足し算しています。
1日 = 60秒 × 60分 × 24時間 になりますので、その値に1000を掛け算してあげれば1日のミリ秒を算出できます。その数字に任意の数字を掛け算することで〇日後や〇日前などの日付を取得することができます。

getEvents(startTime, endTime, options)

サンプルコード2
//現在時刻から10日後の同時刻までの間に存在する予定の中で追加条件に一致する予定をすべて取得して予定タイトルをログに表示するコード
function sampleCode2() {
  var startTime = new Date();
  var endTime = new Date(Date.parse(startTime) + (10 * 60 * 60 * 24 * 1000));
  var options = {
    search: "test"
  }
  var events = CalendarApp.getEvents(startTime, endTime, options);
  for (var i in events) {
    var title = events[i].getTitle();
    Logger.log(title);
  }
}

『 変数の説明 』

startTime = 現在の時刻を代入
endTime = 現在の時刻に10日間プラスした日付を代入
options = 条件を追加して『test』という検索文字列を条件に指定
events = 条件にマッチする予定を配列で取得
title = 取得した予定の件名を順番に代入

sampleCode2も1つ目と同じように条件内の期間にある予定をすべて取得するコードですが、今回はtestという文字列を含む予定をすべて取得するコードを作成しました。optionsという変数で指定しているのですが、オブジェクト形式でsearchというkeyにtestという文字列を指定しています。これで条件期間内にある予定の中から『test』という文字に一致する予定のみ取得されます。

▶ボタンをクリックすると前回と同じようにログに予定タイトルが出力されます。文字列に一致する予定がない場合は予定が取得できませんので、なにも出てこない場合は『test』という文字列を入れて試しに予定を作成してみて下さい。

『注意点』

検索文字列を指定した場合は、『予定タイトル』『場所』『予定の説明』の中に一致する文字列があれば条件と一致します。

getEventsForDay(date)

サンプルコード3
//プログラム起動日の予定をすべて取得して予定タイトルをログに表示するコード
function sampleCode3() {
  var date = new Date();
  var events = CalendarApp.getEventsForDay(date, options);
  for (var i in events) {
    var title = events[i].getTitle();
    Logger.log(title);
  }
}

『 変数の説明 』

date = 今日の日付を代入
events = 条件にマッチする予定を配列で取得
title = 取得した予定の件名を順番に代入

getEventsForDay(date, options)

サンプルコード4
//プログラム起動日の予定の中で追加条件に一致する予定をすべて取得して予定タイトルをログに表示するコード
function sampleCode4() {
  var date = new Date();
  var options = {
    search: "test"
  }
  var events = CalendarApp.getEventsForDay(date, options);
  for (var i in events) {
    var title = events[i].getTitle();
    Logger.log(title);
  }
}

『 変数の説明 』

date = 今日の日付を代入
options = 条件を追加して『test』という検索文字列を条件に指定
events = 条件にマッチする予定を配列で取得
title = 取得した予定の件名を順番に代入

まとめ

今回のコードでは、予定を一度に取得する方法をご紹介しました。日付で指定する方法や、追加条件を指定する方法など、取得方法はいくつかありますが、Google Apps Scriptの場合は、メソッドを呼び出す回数が処理速度に影響を与えますので、出来る限り呼び出し回数を減らすことが効率の良いコードを書く秘訣です。カレンダーだけでなく、それ以外のG Suiteサービスに対してもこの部分は変わりませんので、頭に入れておきましょう。

すべてのサンプルコードはコピーしてスクリプトエディタに貼り付けることでそのまま利用が可能です。

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメント

  1. musiyaki より:

    search に設定する文字列 を複数にすることはできますでしょうか?
    例)「test」と「試験」のどちらかの文字列に一致する予定を取得したい等

    1. admin より:

      コメントありがとうございます。
      私の方でもウェブで確認してみましたが、複数文字のOR検索ができるという記載を見つけることができませんでした。

      英語版Stack OverFlowでも回答がついていない状況です。

      Google Apps Script – Google Calendar – getEvents() multiple search queries – OR logic

      やりたいことを実現する代替案としては、配列に検索したいキーワードを入れてループ処理で複数回getEvents()処理を行うという形でしょうか。

      function myFunction() {
        var startTime = new Date();
        var endTime = new Date(Date.parse(startTime) + (10 * 60 * 60 * 24 * 1000));
        var keywords = ["test", "試験"];
        for (var i in keywords)
          var options = {
            search: keywords[i]
          }
          var events = CalendarApp.getEvents(startTime, endTime, options);
          for (var j in events) {
             var title = events[j].getTitle();
            Logger.log(title);
          }
        }
      }

コメントを残す

*