Microsoft Graph PowerShell SDK を使用して Exchange Online から予定を取得する

Microsoft Graph を使用すれば Exchange Online のメールボックスから予定を取得することができます。PowerShell を使用して実装する場合、Microsoft Graph PowerShell SDK を使用すると比較的簡単に取得することができるため、手順を紹介します。

なお PowerShell を使用するとはいえ、実際には Microsoft Graph を使用しますので、込み入った実装には Microsoft Graph に関する知識も必要になります。今回は Get-MgUserCalendarView コマンドを使用するので、Microsoft Graph の calendarView の基本的な利用方法や、event リソースの構造などを理解している必要があります。

まずは以下のページを参考にして Connect-MgGraph コマンドで Microsoft Graph に接続します。

Microsoft Graph PowerShell SDK の試し方

ユーザー自身の権限で接続する場合は [ユーザー権限で Microsoft Graph PowerShell SDK を試す] を参考にして、Scopes は Calendars.Read を指定します。ユーザー自身の権限を使用するものの、権限を付与されている他人の予定表から予定を取得する場合は Scopes に Calendars.Read.Shared を指定します。アプリケーションの権限で接続する場合は [アプリケーション権限で Microsoft Graph PowerShell SDK を試す] を参考にして、Azure ポータルで Microsoft Graph のアプリケーションの許可の Calendars.Read のアクセス許可を構成しておきます。

接続ができたら、とりあえず取得したい期間を指定して以下のようにコマンドを実行します。

Get-MgUserCalendarView -UserId <対象ユーザーの UPN> -StartDateTime "<取得対象期間の開始日時>" -EndDateTime "<取得対象期間の終了日時>" -All

実行例)

Get-MgUserCalendarView -UserId User01@contoso.com -StartDateTime "2021-09-01T00:00:00Z" -EndDateTime "2021-09-08T00:00:00Z" -All

ただこれでは意味が分からないので、出力を整形します。ついでに、通信の量を減らすために出力するプロパティだけを Microsoft Graph で取得するようにします。例えば以下のようにします。

Get-MgUserCalendarView -UserId <対象ユーザーの UPN> -StartDateTime "<取得対象期間の開始日時>" -EndDateTime "<取得対象期間の終了日時>" -All -Property Subject, Start, End, Organizer, Attendees, Location | Select Subject, @{n="StartDateTime"; e={$_.Start.DateTime}}, @{n="StartTimeZone"; e={$_.Start.TimeZone}}, @{n="EndDateTime"; e={$_.End.DateTime}}, @{n="EndTimeZone"; e={$_.End.TimeZone}}, @{n="Organizer"; e={$_.Organizer.EmailAddress.Address}}, @{n="Attendees"; e={[string]::Join("; ", $(foreach ($attendee in $_.Attendees) {$attendee.EmailAddress.Address}))}}, @{n="Location"; e={$_.Location.DisplayName}}

実行例)

Get-MgUserCalendarView -UserId User01@contoso.com -StartDateTime "2021-09-01T00:00:00Z" -EndDateTime "2021-09-08T00:00:00Z" -All -Property Subject, Start, End, Organizer, Attendees, Location | Select Subject, @{n="StartDateTime"; e={$_.Start.DateTime}}, @{n="StartTimeZone"; e={$_.Start.TimeZone}}, @{n="EndDateTime"; e={$_.End.DateTime}}, @{n="EndTimeZone"; e={$_.End.TimeZone}}, @{n="Organizer"; e={$_.Organizer.EmailAddress.Address}}, @{n="Attendees"; e={[string]::Join("; ", $(foreach ($attendee in $_.Attendees) {$attendee.EmailAddress.Address}))}}, @{n="Location"; e={$_.Location.DisplayName}}

出力例)

Subject       : Test
StartDateTime : 2021-09-07T23:00:00.0000000
StartTimeZone : UTC
EndDateTime   : 2021-09-07T23:30:00.0000000
EndTimeZone   : UTC
Organizer     : User01@contoso.com
Attendees     : Room01@contoso.com, Room02@contoso.com
Location      : Room01; Room02

これで件名、開始日時、終了日時、開催者、出席者、場所の情報を取得して見やすく整形することができました。ほかのプロパティも取得したい場合は、同じような要領で取得できます。あとは煮るなり焼くなり好きにします。

なお calendarView は本来は「Prefer: outlook.timezone」ヘッダーを指定することでレスポンスに含まれる日時のタイムゾーンを変更することが可能ですが、Get-MgUserCalendarView ではヘッダーを指定することはできません。そのためレスポンスに含まれる日時のタイムゾーンは UTC になります。それに合わせて、上記の例ではリクエストに指定する日時も明示的に UTC を指定しています。