フォルダ参照権しかないOutlookの予定表を抽出する【Powershell,Excel VBA】

Outlookの予定表を抽出して会議室の使用実績を取りたいのですが、それには予定表の全詳細参照権が必要です。詳細参照権がない場合は予約調整のための空き情報参照の機能が使えます。

Outlookの予定表抽出

自分自身の予定表抽出なら権限があるので、詳細データまで含めて抽出できます。

OutlookではScriptを使った時と人間の目で見る時と得られる情報が違うようで、フォルダ参照権限のある予定表でもscriptでは予定表をBind(掴む)しようとする時点でエラーになってしまいます。(正確にはLimited Details,日本語Outlookだと空き時間情報、件名、場所という権限の場合)しょうがないので色々調べていたら、予定調整の時にユーザーの空き情報を調べるGetUserAvailabilityというWeb APIを使うと開始・終了時間/空き情報とともに、権限のある場合Detailで件名と場所を取ることができるということがわかりました。これはOutlookの機能ではなくサーバー側のExchangeの機能です。

ExchangeサーバーのWeb API

Exchangeサーバーは2007の頃からWeb APIが実装されていて下記のURLに設定されます。

"https://[Exchangeサーバーアドレス]/ews/exchange.asmx"

office365の場合は人によってアドレスが違うようで、Exchangeサービスに対してautoDiscoverメソッドを使ってURLを引くのが確実です。が、大概下記のアドレスで動きそうな情報がHitします。

"https://outlook.office365.com/EWS/Exchange.asmx"

このアドレスはSOAPのAPIとして実装されていてhttpプロトコルを使ってxmlで書いたRequestを投げるとxmlのResponseが返ってくるというものです。最近(2019)はxmlを使うSOAPよりJSONを使ったREST APIの方が主流(というか書く方もその方が書きやすい)で、Exchange/Office365もREST APIにシフトしようとしていますがまだまだ技術情報の点ではSOAP APIの方が多いのが現状です。

なので、今回このSOAP API(Exchange Web Service,EWS)を使って抽出を試してみます。

EWSを使ってOutlookの予定表を抽出する

検索したところ、下記のMicrosoftの情報がみつかりました。

Office developer center:Exchange EWS を使用して空き時間情報を取得する

これを読むと「会議の調整を自動化するためのAPI」ということでManaged APIを使ったC#のサンプルソースとXML Queryのサンプルが載っています。
Managed APIを使ってPowerShellで作ったサンプルソースがこちら。
-UseDefaultCredentialsオプションを使うと何故かautoDiscoverでコケる。

オンプレ環境なら動くかもしれません。

驚いたことにManaged APIのWebCredentialsが平文パスワードしか受け付けないらしいので、苦肉の策で入力されたパスワードを平文に戻してます。

ExcelでOutlookの予定表を抽出する

オマケ:

偉大なるOutlook研究所様に上記の内容をOutlook VBAで実現するマクロが掲載されていました。

Outlookのマクロは昨今セキュリティが厳しいので、これをExcelに移植することにしました。で、試作してみたExcel VBAがこちら。

Excelマクロの説明

先月の21日から今月の20日までの予約を抽出して、CSVとExcelのsheet1に転記する、というものです。

日付は適当に書き換えてみてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください