electron+react+gas+spreadsheetでgoogle calender用のスケジューラーを作る(2)
明けましておめでとうございます。株式会社スマレジ、開発部のmasaです。
皆様は年末年始はいかが過ごされたでしょうか? masaは弟がちょうど年末にコロナになってしまい、実家で過ごそうかと思っていたのですがお流れに・・・。 久しぶり(大学院生以来かも?)の一人のお正月でした。
さて、今回はスケジューラーの続きです。githubのリンクは↓
GAS側で利用するAPIたち
前回のブログ
electronからコールするGASで作った簡易APIで利用するGoogle Calendar関係のAPIについて、 前回の技術要素でも簡単に触れていましたが、今回はもうちょっと掘り下げて取り上げていきます。
カレンダーに予定を登録する
カレンダーに予定を登録する場合、終日イベントか時間が決まったイベントかによって、利用するAPIが変わります。
終日イベントを登録する
終日イベントの登録はCalendar::createAllDayEvent()
を利用します。
公式ドキュメントリンク developers.google.com
スケジューラーで使っているところ github.com
公式ドキュメントを見てもらえると書いてありますが、createAllDayEvent()
は3パターンオーバーロードされていて、
一番詳細設定できるパターンでは、title(予定のタイトル), startDate(開始日), endDate(終了日), optionsの4つが指定できます。
options
では、予定で設定できる開催場所や、ゲストの招待、メールの発信有無などをJSONで設定することができます。
時間が決まったイベントを登録する
時間が決まったイベントの登録はCalendar::createEvent()
を利用します。
公式ドキュメントリンク developers.google.com
スケジューラーで使っているところ github.com
開始日時と終了日時が必須になったこと以外はcreateAllDayEvent()
と大きくは変わりません。optionsの設定も同様に可能です。
スケジューラーでは開始日の設定有無で判定していますが、これはズボラしているので後で直します。 (githubのソースを見ると、全体的にentityなどが準備されていないですが、最低限の機能が備わったらGAS側と同じようにTSに移行しようかなと思っているので、その時にまとめて綺麗にする予定。)
イベント更新のAPIは存在しない。
既存のイベントを指定して、更新するAPIは公式ドキュメントを見る限り現状ないようです。 なので、すでにあるイベントの日時を変更したいときは、delete-createする必要があります。
イベントを削除するAPIとイベントを検索するAPI
イベントの削除はEvent::createEvent()
を利用します。
公式ドキュメントリンク developers.google.com
スケジューラーで使っているところ github.com
注意が必要なのは、Calendarではなく、Eventクラスの方に削除があると言うことです。Calendar側で検索削除するようなIFはないので、スケジューラーで実装しているように、Calendar::getEvents()
で必要なイベントをリストアップして、その中から指定した条件に合致するものをループで検索して削除するような実装になりそうです。
const events = calendar.getEvents(new Date(from), new Date(to)); // <-- ここでカレンダーに紐づいているイベントを取り出す let res = { status: "not found", }; let start: GoogleAppsScript.Base.Date; let end: GoogleAppsScript.Base.Date; for (let i = 0; i < events.length; i++) { if (events[i].getTitle() === versionName + searchString) { // 検索条件(イベント名がバージョン名+指定の文字列と一致)にヒットすれば削除 res.status = "deleted"; events[i].deleteEvent(); } }
カレンダー関係で利用するAPIはこれくらいです。
Calendar::getEvents()
の期間指定が結構広くとってもOKなのが、さすがGoogleだなと思いました笑