GraphAPIでM365の他人のカレンダーを取得する方法
この記事ではMicrosoftのGraphAPIを使用して自分が閲覧権限がある他人のカレンダーのデータを取得する方法について解説します。
目次
・権限とスコープについて
・APIエンドポイント
・カレンダーの共有設定

権限とスコープ
GraphAPIを呼び出すにはOAuth認証で権限を取得する必要があります。自分自身の権限の範囲で処理を行うにはDelegated permissionを使用します。Delegated permissionを使用するとAさんの代理としてAさんがアクセス可能な範囲のデータの取得だけができるようになります。
スコープは以下のCalendars関係のを設定します。
CalendarsReadWriteShared

他にはオンラインミーティングのURLを取得するのに以下のスコープも必要です。
OnlineMeetingsRead
あとはAPIを呼び出すことでデータの取得ができます。
もう一つのApplication permissionはサービスとして動作される場合に使用します。例えば「毎日深夜1時に全ユーザーのカレンダーを取得して会議に費やした時間を計算する」といった場合にはApplication permissionの方が適切でしょう。こちらは全ユーザーのデータが取得できてしまうため意図しない範囲の権限を付与してしまわないように注意が必要です。
参考サイト
Office365 Graph で2種類のアクセス許可の仕様にハマった話
[Event Info]
第25回 Office 365 勉強会:Microsoft Graph API https://jpo365ug.connpass.com/event/14289…

APIエンドポイント
APIエンドポイントで自分ははまったのですがDelegated permissionでは以下のエンドポイントは呼び出すことができません。
GET /users/{id | userPrincipalName}/calendars/{id}/events
このエンドポイントは多分Application permissionでしか呼び出せません(未確認)

他人のイベントを取得するにはまず他のユーザーから共有済みのカレンダーの一覧を取得する必要があります。

取得したカレンダーのCalendarIdを保存し、その値を使ってこのAPIを呼び出します。

これでイベントの一覧を取得できます。
カレンダーの共有

このエンドポイントでは他人から共有されたカレンダーの一覧が取得できます。AさんがBさんのカレンダーをAPIで取得できるようになるためにはBさんに共有設定をしてもらう必要があります。
Outlookカレンダーの上部のメニューバーの共有をクリックして設定ができます。

これでAPIから他人のカレンダーとイベントのデータを取得できるようになりました。