ささみ学習帳 - sasami's study book

ささみ学習帳

Microsoft365 や Power Platform について学んだこと・アイデアのメモ

Power Automate クラウドフローで会議室リストと会議室メールボックスの一覧を取得する

この記事は「Microsoft Power Automate Advent Calendar 2024」に参加しています。
シリーズ3 - 3日目の記事です。

qiita.com

 

 

はじめに

Power Automate クラウドフローでテナント内の会議室リストと会議室メールボックスの一覧を取得する方法です。基本的な情報のみであればMicrosoft 365 ライセンス付属のPower Automate Basicの範囲内でも取得できることを確認しました。(注意事項あり)

 

考え方

Power Automate ので利用可能なコネクタとしては用意されていません。「HTTP 要求を送信します」アクションを使ってGraph APIを呼び出すことで取得することが可能でした。

Graph API の「findRooms」と「findRoomLists」エンドポイントを利用します。

learn.microsoft.com

learn.microsoft.com

 

<<重要な注意事項>>

下記のようなリスクがありますので、本番運用で採用されるかは十分に検討が必要です。

今回はbeta版のGraph APIを利用します

今回利用するGraph APIのエンドポイントは記事作成時点ではbetaで正式リリースされたものではありません。正式リリースされたときに動作が変わる可能性があります。

本来呼び出せないエンドポイントの可能性があります

今回はOffice 365 ユーザーコネクタの「HTTP要求を送信します」アクションを利用してGraph APIを呼び出しています。このアクションで送信できるGraph APIの範囲は下図のように定義されているのですが、今回呼び出しているエンドポイントはこれに含まれていません。

Microsoft Graph REST API 要求を作成して呼び出します。次のセグメントがサポートされています: 第 1 セグメント: /me、/users/<userId> 第 2 セグメント: messages、mailFolders、events、calendar、calendars、outlook、inferenceClassification。詳細情報: https://docs.microsoft.com/en-us/graph/use-the-api

ワークスペースも対象となる

今回利用するGraph APIのエンドポイントでは会議室メールボックスだけでなく和^狗スペースメールボックスも出力されます。Powershellで情報を取得してみるとわかるのですが会議室もワークスペースもRecipientTypeDetails が RoomMailbox となっており、内部的には会議室メールボックスのバリエーションのように扱われていると思われます。
 
 

サンプルフロー全体

テナント内の会議室メールボックスを会議室リストごとに取得しCSVファイルに出力するフローです。

 

 

フロー解説

1.[Variables]変数を初期化する-RoomLists

最終的にCSVファイルに出力するために変数に情報を格納します。

 

1.[Control]スコープ - デフォルトカレンダーを取得

今回利用する「イベントを作成する」エンドポイントではイベントを作成するカレンダーのIdが必要となるため、まずカレンダーの情報を取得します。

※今回はデフォルトの"予定表"カレンダーにイベントを作成します。

 

2.[Office 365 ユーザー]HTTP要求を送信します-テナント内の会議室メールボックス

※このアクションは今回のフローには不要ですがサンプルとして追加してあります。

このアクションを実行するユーザーが参照可能なテナント内の全ての会議室を取得します。

このようなJSONで会議室の名前とメールアドレスのリストが返されます。

 

3.[Office 365 ユーザー] HTTP要求を送信します-会議室リスト

このアクションを実行するユーザーが参照可能なテナント内の全ての会議室リストを取得します。

このようなJSONで会議室リストの名前とメールアドレスのリストが返されます。

 

4.[Control]それぞれに適用する-会議室リストごとに

3で取得した会議室リストごとに処理を行います。

  • Select an  output from previous steps
    • @{body('HTTP_要求を送信します-会議室リスト')?['value']}

 

4-1.[Office 365 ユーザー] HTTP 要求を送信します-会議室リスト内の会議室

会議室リストに登録されている会議室メールボックスを取得します。

このようなJSONで指定した会議室リストに含まれる会議室メールボックスが返されます。

 

4-2.[Data Contol]選択

取得した情報をCSVファイルに主力するレイアウトを意識したJSONに変換します。

  • From
    • @{body('HTTP_要求を送信します-会議室リスト内の会議室')?['value']}
  • Map
    • roomListName
      • @{items('それぞれに適用する-会議室リストごとに')?['name']}
    • roomListAddress
      • @{items('それぞれに適用する-会議室リストごとに')?['address']}
    • roomName
      • @{item()?['name']}
    • roomAddress
      • @{item()?['address']}

 

4-3.[DataControl]作成-配列の結合

union関数を使って、RoomList変数と4-2.で作成したJSON配列を結合します。

  • 入力
    • union(variables('RoomLists'),body('選択'))

 

4-4.[Variables]変数の設定-RoomLists

4-3.で結合した配列をRoomLists変数に格納します。

  • Name
    • RoomLIsts
  • Value
    • @{outputs('作成-配列の結合')}

 

5.[Data Control]CSVテーブルの作成

RoomList変数に格納されているJSON配列をCSVレイアウトに変換します。

  • From
    • @{variables('RoomLists')}

 

6.[OneDrive for Business]ファイルの作成-CSVファイルに出力

5.で作成したデータをOneDrive for BusinessにCSVファイルとして作成します。

  • フォルダーのパス
    • /
    • ※お好みで
  • ファイル名
    • exo_rooomlists_@{convertFromUtc(utcNow(),'Tokyo Standard Time','yyyyMMdd-HHmmss')}.csv
    • ※お好みで
  • ファイルコンテンツ
    • concat(
          decodeUriComponent('%EF%BB%BF'),
          body('CSV_テーブルの作成')
      )
    • CSVテーブルの作成アクションの出力をそのままセットすると、CSVファイルは文字コードがUTF8として作成され、Excelでは文字化けします。それを回避するため、UTF8 BOM付きでファイルを作成しています。
    • こちらの情報を参考にしています

 

実行結果

OneDrive for Business に作成されたファイルを開くとこのように会議室リストごとの会議室メールボックスが出力されているはずです。

 

さいごに

とある目的のフローを作成する際に確認した内容を備忘録的にまとめてみました。beta版のGraph APIが必要なこと、Microsoft Placesがリリースされることで変化が予想されたことから元々の目的のフローは一旦保留していて正式リリース後に再開するつもりです。

また、今回利用したGraph  APIエンドポイントでは、会議室のその他のメタデータ(建物、フロア、許容人数など)の情報を取得できません。その辺りを取得する為のエンドポイントを利用する為にはPower Automate Premium ライセンスが必要になりそうです。