MENU

GASとCalendar APIの予定IDの違い

当ページのリンクには広告(PR)が含まれていることがあります。
GASとCalendar APIの予定IDの違い。予定の識別子、IDの種類を区別、取得方法を選ぶの処理例。

CalendarAppで保存した予定IDをCalendar APIへ渡したのに、予定が見つからない場合は、IDの種類を確認します。CalendarAppのCalendarEvent.getId()が返すのはiCalUIDで、Calendar APIのイベントのidとは同じものではありません。

末尾を削るなどの文字列加工で、片方からもう片方へ変換する方法は使わないでください。どの仕組みから取得した値かと、登録先のカレンダーIDを組にして保存し、API側の検索で対応するイベントを確かめます。

目次

iCalUIDとAPIのidを分けて記録する

公式のCalendarEvent資料は、iCalUIDとCalendar APIのidを交換して使えないことを明記しています。繰り返し予定では、各回のAPI idが違っていても、iCalUIDは同じになる点も説明されています。

そのため、iCalUIDが1件見つかったらAPIのidも必ず1件、とは限りません。毎週の予定のどの回を扱うかまで必要な場合は、開催日時や、繰り返しの元に対応する情報も確認します。

保存する列名も単なる「ID」だけにせず、「カレンダーID」「CalendarAppのiCalUID」「Calendar APIのid」と区別すると、別の処理へ渡すときに取り違えにくくなります。APIを使っていないツールなら、必要な識別子だけを保存します。

同じiCalUIDに複数のAPI idがある例

次は架空のオブジェクトで、CalendarApp側の値と、APIから受け取った項目の対応を整理します。実カレンダーへの問い合わせは行わない例です。

function mapCalendarEventIds(calendarId, appEvent, apiItems) {
  if (typeof calendarId !== 'string' || calendarId.trim() === '') {
    throw new Error('カレンダーIDを指定してください');
  }
  const iCalUID = appEvent.getId();
  const apiEventIds = apiItems
    .filter(event => event.iCalUID === iCalUID)
    .map(function (event) {
      if (typeof event.id !== 'string' || event.id === '') {
        throw new Error('APIのidを確認してください');
      }
      return event.id;
    });
  return {calendarId: calendarId, iCalUID: iCalUID, apiEventIds: apiEventIds};
}

function previewCalendarIdMap() {
  const appEvent = {getId: () => 'practice-series@example.invalid'};
  const apiItems = [
    {id: 'a1b2c3d4', iCalUID: 'practice-series@example.invalid'},
    {id: 'a1b2c3d5', iCalUID: 'practice-series@example.invalid'},
    {id: 'b1b2c3d4', iCalUID: 'other@example.invalid'}
  ];
  console.log(JSON.stringify(mapCalendarEventIds('practice-calendar', appEvent, apiItems)));
}

期待するapiEventIdsは["a1b2c3d4","a1b2c3d5"]です。どちらか一方を自動で採用せず、同じiCalUIDに対応する候補を残します。例のIDは実際の予定ではなく、文字列の役割を確認するために作ったものです。

API側で対応を探す

Calendar APIのevents.listには、iCalUIDで絞り込むパラメータがあります。APIのidしか受け取らない取得処理へiCalUIDを渡す代わりに、このような対応する検索方法を使います。

応答に次のページがある場合は、最初のページだけで全件と判断しないようにします。繰り返しの各回へ展開しているかどうかでも、取得する項目の意味が変わります。どの設定で取得した結果なのかを残します。

Eventsリソースのid、iCalUID、recurringEventIdなどの説明を確認し、予定の元と各回を区別します。同じタイトルや同じ開始日時だから同じ予定だと決める方法は、識別子の代わりになりません。

カレンダーIDも一緒に確かめる

予定の識別子だけ合っていても、参照するカレンダーが違えば目的の予定を取得できません。既定のカレンダーを読む関数と、カレンダーIDを明示して読む関数を混ぜないようにします。

アクセスできない場合も、IDの変換だけで解決するとは限りません。実行アカウントの閲覧権限や、共有カレンダーの設定も確認します。APIを追加する場合は、承認するスコープと実行者も点検してください。

ローカルでは、架空のiCalUIDへ複数IDが対応する例、対応なし、別のUID、不正なidを確認しました。Google APIの検索や権限確認は未実行です。予定登録の基本とGASの共有・権限を基に、使うAPIに合わせて保存する項目を決めます。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次