MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

標準アクションで取得できない属性情報を取得しよう - Office 365 Groups & Untyped Object

はじめに

最近作ったアプリで使った方法の紹介です。

Azure AD上のグループを検索して、そのオーナーとメンバーを一覧表示するようなアプリを作りたいと考えました。作りは非常にシンプルで、検索ボックスとギャラリー3つの構成です。

まずはデータ接続として、 Office 365 Groups を追加します。

グループの検索は Office365Groups.ListGroups() のアクションで行い、結果を左のギャラリーに表示しています。

「よし次はオーナー一覧を・・・」と思いますが、残念ながら標準のアクションではグループのオーナーを一覧することはできません。(アクションがない)

また、メンバー一覧を表示するのに Office365Groups.ListGroupMembers() が利用できますが、このアクションでとれる属性情報は非常に限定的です。

ほんとはcompanyNameやemployeeIdを表示したいのに!オンプレのextensionAttributeも使いたいのに!!

という2つの不満点 - アクションが足りない、属性情報が少ない - に対応した際の手法です。

Office365Groups.HttpRequest を使おう

Graph APIを使えばオーナーを一覧したり、グループメンバーの属性をもっとたくさんとれることはよく知られています。

Graph APIをアクションとして実行する際、Power Automateではよく Office 365 GroupsコネクターのHTTP要求のアクションが使われています。

じゃあこのアクションを Power Apps で使えばいいじゃないか!というのが解法です。

ただし注意点があり、HTTP要求のアクション (Office365Groups.HttpRequest ) を Power Appsで利用する場合には、以下の試験的機能を有効にする必要があります。

learn.microsoft.com

この機能を有効にしたうえで、グループの検索結果のギャラリーに以下の式を設定します。(各行を選択した時のアクション)

Select(Parent);
Set(groupOwners,Office365Groups.HttpRequest("https://graph.microsoft.com/v1.0/groups/"&ThisItem.id&"/owners","GET",""))

ポイントはOffice365Groups.HttpRequest("https://graph.microsoft.com/v1.0/groups/"&ThisItem.id&"/owners","GET","") です。まさにGraph API を実行している部分になります。

最初のパラメータ https://graph.microsoft.com/v1.0/groups/"&ThisItem.id&"/owners でグループのオーナーをとるURLを指定して、2個目のパラメータ "GET" がメソッドにあたります。

List group owners - Microsoft Graph v1.0 | Microsoft Learn

Power Automate で言えば以下のようなアクションの設定です。

これでオーナーの一覧が変数に入りました。この変数は今Untyped Object (明示的に型が指定されていないデータ) になっているので、Power Appsのほうでデータ型を指定してあげます。

Table(groupOwners.value)

これで Power Apps で扱えるテーブル型のデータ (= オーナー一覧のデータ) が得られました。あとはギャラリー内のラベルに対して、必要な属性名を使って

Text(ThisItem.Value.displayName)

のように構成していきます。

なお、オーナーの情報でどんな属性が取れるかは、一度 Power Automateで同じアクションを実行してみるとわかりやすいです。

次にメンバー一覧です。メンバー一覧の取得は https://graph.microsoft.com/v1.0/groups/"&ThisItem.id&"/members というようなURLになります。

List group members - Microsoft Graph v1.0 | Microsoft Learn

ここでは追加で必要な属性情報をとりたいので、$select というURLパラメータを使って属性を指定します。 https://graph.microsoft.com/v1.0/groups/" & ThisItem.id & "/members?$select=displayName,companyName,mail,employeeId,onPremisesExtensionAttributes

どんな属性名かわからん!という場合には公式のレファレンスを確認してください。

user リソースの種類 - Microsoft Graph v1.0 | Microsoft Learn

Set(
    groupMembers,
    Office365Groups.HttpRequest(
        "https://graph.microsoft.com/v1.0/groups/" & ThisItem.id & "/members?$select=displayName,companyName,mail,employeeId,onPremisesExtensionAttributes&$top=200",
        "GET",
        ""
    )
);

Power Apps上の数式はオーナーの場合とほぼ同じです。

ユーザー一覧がこれでとれたので、ギャラリーに Table(groupMembers.value) を指定して、

必要な属性名を Text(ThisItem.Value.employeeId) といった具合に、ラベルに設定します。

これでほしかったアプリの完成です。(ほんとはページングの処理とかするけど)

このように、Power Automate 同様、 Office 365 Groups の HTTP要求アクションを利用することで標準のアクションで足りない情報や、そもそもアクションがないみたいなケースに対応できる可能性があります。

ただし注意点は Untyped Objectに関する試験的な機能を有効にしないといけないことです。ちょっと最初は難しいかもしれませんが、Power Automateの方で試したりして慣れていくと非常に強力な手法だと思います。是非お試しあれ~。

learn.microsoft.com