📚

[GoogleAppsScript] GoogleCalendarの予定に埋まっているZoomのURLを取る方法

commits2 min read

概要

Google Calendar を Zoom の Add-on で連携している場合に設定された Zoom のミーティング URL を API 経由で取得したかった。
Google App Script の Calendar の CalendarEvent クラスのメソッドでは不可能。 
REST API を用いて、イベントの conferenceData を取得する必要があります。

事の起こりは...

設定した MTG を一覧にして、それを Web で (HTML 形式で) 公開したい、ということで、既存のカレンダーに設定された MTG から タイトル、URL、パスコード等を取得しようと思ったのでした。

とりあえずこうしてみるよね

function myFunction() {
  const events =   CalendarApp.getDefaultCalendar().getEventsForDay(new Date());
  console.log(events[0].getLocation());

}

ところが手動で MTG 場所として設定された URL は取れるものの、 Add-on で設定された URL は取れなかったのでした。
ちなみに Add-on で設定されるとこんな感じになります。

それっぽい関数はないかと見てみるものの

なさそうです。

CalendarEvent のリファレンス を見てもなさそう。

ちなみに、getAllTagKeys() を使うと、 meetingId , meetingParams というのが取れるので、 getTag("meetingParams") してみましたが、下記のようなデータしか取れませんでした

{"topic":"テスト","type":2,"start_time":"2021-07-07T17:00:00+09:00","duration":30,"timezone":"Asia/Tokyo"}

調べてみると

標準では Google Meet が使えるので、その場合の Hangout の URL はそもそもどこに入っているのかを調べましたがやはり meetingParams 等に入っているわけではなかったです。

ぐぐるしかないです。

calendar api hangout url でぐぐってみました。

見つかったのは Events | Calendar API | Google Developers です。

ここには hangoutLink というのもありますが、 conferenceData というのが入っており、どうやらこれが本命のようです。

function myFunction() {
  const calendarId = "xxxxxxx@gmail.com";
  Calendar.Events.list(calendarId, {});
}

とすれば良さそうですが、この時点で Calendar.Events とかで補完が効いてくれません。

サービスの追加

このようにサービスとして Calendar API を組み込む必要がありました。

  Calendar.Events.list(calendarId, {})["items"].forEach( (event) => {
    console.log(Calendar.Events.get(calendarId, event.getId()));
  });

あとは list で取得して正常取得した場合にはレスポンスに items が含まれるので、上記のようにしたら

// 一部省略

{ 
  htmlLink: '****',
  description: '***',
  id: '***',
  status: 'confirmed',
  summary: 'タイトル',
  conferenceData: 
   {
     entryPoints: [ [Object], [Object], [Object] ],
   }
}

conferenceData.entryPoints の中に必要なデータが入っているのでそれを取得すれば良いです。

なお list メソッドにパラメータを与えないと最初から100件とかを取ってしまうのでご注意ください。
timeMin とかを与えると良いと思います。