🤩

複数のGoogleカレンダーの予定を集約するGAS

2021/10/04に公開

要約

複数のGoogleカレンダーの予定を1つのカレンダーに集約するGASを作成しました。
実装はこちら

背景

複数の組織に所属しているとその分だけGoogle Workspaceのアカウントが発行されてしまい、各アカウントのカレンダーで予定を管理していると日程調整が難しいことがそれなりにあります。自分だけならスマホアプリなどで全アカウントの予定を一括で確認できますが、例えばチームメンバーそれぞれのカレンダーを共有して全員の空いてるところで会議を設定するといった運用をしている場合、組織外での予定もどうにか伝える必要があります。

そこで今回は複数のGoogleカレンダーの予定を1つのカレンダーに集約し、それを相手に共有するためのスクリプトを作成しました。共有する際に「時間枠のみ共有」にしておけば予定の詳細が漏れる心配もありません。

実装

準備

事前に以下の準備が必要です。

  • 適当なアカウントで集約先のカレンダーを作成。
  • 予定を共有したい全カレンダーを上記のアカウントに共有。

スクリプト

実際に作成したスクリプトは以下の通りです。

const CALENDAR_ID_BASE = '****';  // 集約先のカレンダーのID
const CALENDAR_DICT = {  // 予定を共有したいカレンダー一覧
    "cal_1": "id_1",
    "cal_2": "id_2"
};
const DAYS_LENGTH = 14;  // 予定を同期したい日数

function updateEvents() {
    const calendar_base = CalendarApp.getCalendarById(CALENDAR_ID_BASE);

    const startTime = new Date();
    const endTime = new Date();
    endTime.setDate(startTime.getDate() + DAYS_LENGTH);

    // delete events
    const events = calendar_base.getEvents(startTime, endTime);
    for (const event of events) {
        event.deleteEvent();
    }

    // add events
    for (const calendar_title in CALENDAR_DICT) {
        console.log(calendar_title);
        const calendar_id = CALENDAR_DICT[calendar_title];
        const calendar = CalendarApp.getCalendarById(calendar_id);

        const events = calendar.getEvents(startTime, endTime);
        for (const event of events) {
            const title = event.getTitle() ? event.getTitle() : calendar_title;
            const new_event = calendar_base.createEvent(title, event.getStartTime(), event.getEndTime());
            console.log(`${title}: ${new_event.getId()}`);
        }
    }
}

プログラム中のコメントにもありますが、 DAYS_LENGTH で予定を同期させたい日数を指定します。例えば上記のように 14 とすると、プログラム実行日から14日後までの予定が集約先のカレンダーに登録されます。

最後に

最後に一日に一回(あるいは適当な頻度で) updateEvents が実行されるようにGASのトリガーを設定すれば、DAYS_LENGTH で指定した日数分の予定が同期されるはずです。あとは冒頭でも述べたようにこれを適当な相手に共有すれば、自分の予定の埋まり具合を一発で共有できます。

Discussion