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に合わせて保存する項目を決めます。
