株式会社スマレジの開発部でスマレジのサーバサイドを作っています

electron+react+gas+spreadsheetでgoogle calender用のスケジューラーを作る(2)

明けましておめでとうございます。株式会社スマレジ、開発部のmasaです。

皆様は年末年始はいかが過ごされたでしょうか? masaは弟がちょうど年末にコロナになってしまい、実家で過ごそうかと思っていたのですがお流れに・・・。 久しぶり(大学院生以来かも?)の一人のお正月でした。

さて、今回はスケジューラーの続きです。githubのリンクは↓

github.com

GAS側で利用するAPIたち

前回のブログ

masa2019.hatenablog.com

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だなと思いました笑