コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

Power Platformで部署情報でユーザーを検索する


スポンサードリンク

はじめに

Power Apps やPower Automate で「部署情報を利用してユーザーの検索を行いたい」という要望をよく耳にします。

この記事ではPower Apps やPower Automate での部署情報を用いてのユーザーの検索方法についてまとめます。

Office 365 Users - SearchUserV2では検索できない

しかし、Power Apps やPower Automate でユーザーの検索に利用されるOffice 365 Usersコネクタの「SearchUserV2」では部署の検索が行えません。

learn.microsoft.com

「SearchUserV2」で検索可能な項目は上記公式ドキュメントでも記載されている通り、

  • 表示名
  • メール
  • メールのニックネーム
  • ユーザー プリンシパル

の6つです。

部署は対象外となっているわけですね。

また、以下のように検索結果に対して部署名でフィルターを行うやり方を行おうとしているケースをよく見ます。

しかしこれでは期待する結果が得られない可能性があります。

このような記載の場合、処理順としては

  1. ユーザーの検索
  2. "1"の検索結果に対してフィルター処理

となりますので、"1"の検索結果で得られた情報以上の結果を得ることはできません。

「SearchUserV2」では最大999件までの結果しか取得できないのでそれより多い社員数がいる会社では抜け漏れが発生してしまいます。
999件の取得結果に対してフィルター処理を行うことになるからですね。

999名より社員数が少ない会社であればこの方法でも問題はないですが、それより多い社員が在籍している会社ですと正しい結果が得られない可能性があります。

Power Apps で部署でユーザー検索する

標準コネクタでは部署情報で検索を行うことができないのでGraph APIを利用して検索を行います。

利用するAPIはこちらです。

learn.microsoft.com

こちらをOffice 365 GroupsコネクタのHttpRequestアクションを用いて呼び出します。

なお公式ドキュメントでも記載されている通りこちらのアクションは非推奨になっています。
Power Automateでは既にこのアクションは利用できないようになっているのでその点、ご留意のうえご使用をお願いします。

さて、肝心の取得方法ですが以下のような式で行います。

UpdateContext(
    {
        searchUserResult:
            Office365グループ.HttpRequest(
                $"https://graph.microsoft.com/v1.0/users?$search=department:{EncodeUrl(SearchDepartmentTxt.Text)}&$select=displayName,surname,givenName,businessPhones,mail,department,jobTitle,id,userPrincipalName,mobilePhone",
                "GET",
                "",
                {
                    CustomHeader1: "ConsistencyLevel: eventual"
                }
            )
    }
)

Filterクエリを利用するのでもいいですが、今回は部分一致でも検索を掛けたかったのでsearchクエリを利用しています。

また、日本ですと部署名は日本語かと思いますのでEncodeUrl関数を用いてGraph APIでも利用できる形式に変換しています。
日本語のままだと検索結果が得られませんのでご注意ください。

selectクエリでは取得するプロパティを指定しています。
必要に応じて書き換えてください。

最後にRequest headersですが、こちらはsearchクエリを実行するのに必要なので指定しています。
searchクエリは高度なクエリなので、 ConsistencyLevel ヘッダーを eventual に設定する必要があるのですが、お呪いみたいなものだと認識しておいてください。

learn.microsoft.com

なお他の複数条件でも検索したい場合は以下のような式になります。

UpdateContext(
    {
        searchUserResult:
            With(
                {
                    searchTerm: 
                        Concat(
                            Filter(
                                [
                                    If(
                                        !IsBlank(SearchDispNameTxt.Text),
                                        $"""displayName:{SearchDispNameTxt.Text}"""
                                    ),
                                    If(
                                        !IsBlank(SearchSurNameTxt.Text),
                                        $"""surname:{EncodeUrl(SearchSurNameTxt.Text)}"""
                                    ),
                                    If(
                                        !IsBlank(SearchGivenNameTxt.Text),
                                        $"""givenName:{EncodeUrl(SearchGivenNameTxt.Text)}"""
                                    ),
                                    If(
                                        !IsBlank(SearchEmployNumTxt.Text),
                                        $"""businessPhones:{SearchEmployNumTxt.Text}"""
                                    ),
                                    If(
                                        !IsBlank(SearchMailTxt.Text),
                                        $"""mail:{SearchMailTxt.Text}"""
                                    ),
                                    If(
                                        !IsBlank(SearchDepartmentTxt.Text),
                                        $"""department:{EncodeUrl(SearchDepartmentTxt.Text)}"""
                                    ),
                                    If(
                                        !IsBlank(SearchJobTitleTxt.Text),
                                        $"""jobTitle:{EncodeUrl(SearchJobTitleTxt.Text)}"""
                                    )
                                ],
                                ThisRecord.Value <> Blank()
                            ),
                            ThisRecord.Value,
                            " AND "
                        )
                },
                Office365グループ.HttpRequest(
                    $"https://graph.microsoft.com/v1.0/users?$search={searchTerm}&$select=displayName,surname,givenName,businessPhones,mail,department,jobTitle,id,userPrincipalName,mobilePhone",
                    "GET",
                    "",
                    {
                        CustomHeader1: "ConsistencyLevel: eventual"
                    }
                )
            )
    }
)

Power Automate で部署でユーザー検索する

Power Automateの場合もPower Appsと同様のGraph APIを用います。
ただしPower Appsと異なり、Power AutomateではOffice 365 GroupsのHttpRequestは使えないので他のアクションを利用します。

現時点では、標準アクションで今回のAPIを実行可能なアクションは存在しません。

koruneko.hatenablog.com

従って、プレミアムコネクタである「Microsoft Entra ID 付きの HTTP (事前承認済み)」の「HTTP 要求を呼び出す」を利用します。

利用するAPIに関してはPower Appsのときと同じなので説明は割愛します。

設定している式はこちら

https://graph.microsoft.com/v1.0/users?$search="department:@{encodeUriComponent(outputs('部署名'))}"&$select=displayName,surname,givenName,businessPhones,mail,department,jobTitle,id,userPrincipalName,mobilePhone

おわりに

Power AppsやPower Automateで部署情報で検索を行いたい場合は現時点ではGraph APIを利用することになります。

こちらを利用した実装を行う場合は今後の運用における改修難易度が上がってしまう点にご注意ください。
特にPower AppsはJSONの操作が必要になってきますのでその点も理解して利用有無を決めてください。


スポンサードリンク