Power Platformにおいて、社員情報の取得の定番といえば「Office 365 ユーザー」コネクタですよね。Entra IDの情報を簡単に取得できるので非常に便利です。
ただ、不便な点もないわけではないんです。
実はPower Appsからだと従業員ID(employeeId)がMyProfileV2()
やUserProfileV2()
では取得できないんですよね。社員番号・従業員番号は使用機会が多い情報なので結構不便です。
今回は従業員ID(employeeId)をPower Apps単体で取得する方法を解説します。
【結論】Office365ユーザー.HttpRequest()を使う
結論としては、Office365ユーザー.HttpRequest()
でMicrosoft Graph APIのuser
にGETリクエストを飛ばすのが最も簡単でパフォーマンスが良い方法です。
関数の全体像は以下のとおりです。
Text(
Office365ユーザー.HttpRequest(
"https://graph.microsoft.com/v1.0/users/natsugure@exmaple.com?$select=employeeid",
"GET",
""
).employeeId
)
Office365ユーザー.HttpRequest()
で必要な引数は以下のとおりです。
※関数バーに表示されるヒントに基づいて表記しています。
- Uri
- アクセスするURIをテキスト型で渡す。
- Method
- HTTPメソッドをテキスト型で渡す。
- file
- 要求の本文を指定。Microsoft Learnでは必須扱いになっていませんが、省略するとエラーになります。今回のように何も本文を渡す必要がない場合は、空文字列
""
を指定します。
- 要求の本文を指定。Microsoft Learnでは必須扱いになっていませんが、省略するとエラーになります。今回のように何も本文を渡す必要がない場合は、空文字列
URIにはGraph APIの/users/{id | userPrincipalName}
に$select
クエリパラメータを付けたものを指定します。
$select=employeeId
を付けないと、通常のUserProfileV2()
で返ってくるものと同じ列しか取得できないので注意しましょう。
https://graph.microsoft.com/v1.0/users/natsugure@exmaple.com?$select=employeeid
Text関数で型変換する
Office365ユーザー.HttpRequest()
の戻り値は、型指定されていないオブジェクト(Dynamic、旧名・UntypedObject)です。
以下の例は従業員IDが10002のユーザーの結果を取得した場合の戻り値です。

{"@odata.context":"https://graph.microsoft.com/v1.0/$metadata#users(employeeId)/$entity","employeeId":"10002"}
Microsoft Learnの「型指定されていないオブジェクトのデータ型」の説明では、明示的な型変換が必要と書かれています。
型指定されていないオブジェクト は、複雑なものでも単純なものでも、あらゆるデータ構造を保持できる Power Fx のデータ型です。 直接使用することはできず、データ型への明示的な変換が必要です。 型指定されていないオブジェクト のレコードのフィールドは、ドット表記を使用してアクセスでき、フィールドの存在は実行時にのみ検証されます。
型指定されていないオブジェクトのデータ型 – Power Platform | Microsoft Learn
そのため、Text関数でPower Apps内で使用できるテキスト型に変換してあげます。
Text(
Office365ユーザー.HttpRequest(
"https://graph.microsoft.com/v1.0/users/natsugure@exmaple.com?$select=employeeid",
"GET",
""
).employeeId
)
従業員IDが数字のみで構成されていて、数値の大小等の比較を行いたい場合はInt
やValue
関数で数値型に変換してやれば良いです。
【余談】UserProfileV2でも裏側では取得できてる
UserProfileV2()
の$select
パラメータにemployeeId
を指定した時、我々開発者は利用できませんが、実はPower AppsとGraph APIとの間で行われる通信ではきちんと取得できていたりします。
Set(UserProfile, Office365ユーザー.UserProfileV2(id, { '$select': "employeeId" }))
Power Appsのライブ監視を開いた状態で、上記の関数を実行します。
すると、応答にはきちんとemployeeId
が取れていることが確認できます。

しかし、変数には格納されていません。そもそもemployeeId列が存在しません。

なぜ取得できるいるにもかかわらず、関数の戻り値であるレコードには反映されないのでしょうか。
これはUserProfileV2の戻り値がGraphUser_V1
というレコードだと決まっているからです。
GraphUser_V1
には$select
パラメータを未指定で取得したときの既定フィールドで構成されており、employeeId
は含まれていません。
あらかじめレコードの列がわかっているから、私たちはPower Apps上のInteliiSense(コード補完)で簡単にプロパティにアクセスできるというメリットがありつつ、取れる力はあるのに利用できない列が生まれてしまうという、ちょっと不便な面もありますね。
おわりに
個人的にPower Appsの開発だと、ついついHTTPリクエストを使うという選択肢が頭から抜けてしまいます。
今回のようにGraph APIを活用できる場面では、Office 365 ユーザー以外のコネクタも含めて、じゃんじゃん活用していきたいですね。
コメント