こんにちは。sinyです。
この記事では、PowerAppsでユーザ検索機能を実装する方法について紹介します。
PowerAppsの標準で用意されている「人々テンプレート」を使うことであっという間に実装することができます。
また、デフォルトのままだとOffcie365ユーザのDisplayNameに設定されている文字列(名 姓 or 姓 名)と検索文字列を単純に文字列比較しているようなので、思ったような検索ができないケースがあります。
例えば、DisplayNameが「tarou yamada」で登録されている場合は、「tarou yamada」という文字列検索は条件一致しますが、「yamada tarou」と検索してもDisplayNameに一致する文字列が存在しないため何も表示されません。
上記の回避策についても最後にご紹介します。
ユーザ検索機能の実装手順
PowerAppsの画面を開いたら、新しいアプリ→キャンバスを選択します。
空のアプリ→「タブレットレイアウト」からアプリを作成します。
以下のような画面が表示さるので、挿入→新しい画面→「人々」を選択して新規に画面を追加します。
※新しい画面の中から「人々」を選択
以下のように画面が生成されます。
Screen1は不要なので削除しておきましょう。
また、Screen2内のPeopleAddedGallery1も削除しておきます。
以上で完成です。
アプリのプレビュー画面をクリックして動作を確認してみましょう。
検索画面が表示されるのでユーザ名を検索すると、こんな感じで名前とメールアドレスが表示されます。
表示項目は任意にカスタマイズできます。
Rectangle2を選択した状態で挿入→ラベルを選択します。
追加されたラベル(Label1)をクリックしてTextプロパティに表示したいユーザ属性を指定しましょう。
例えば、所属部署名を表示したい場合は「ThisItem.Department」とします。
ユーザ情報の出力プロパティとして以下の項目が用意されています。
プロパティ名 | 種類 | 内容 |
市区町村 | string | ユーザーの市区町村 |
CompanyName | string | ユーザーの会社 |
国 | string | ユーザーの国/地域 |
課 | string | ユーザーの部署 |
DisplayName | string | ユーザーの表示名 |
GivenName | string | ユーザーの名前 |
ID | string | ユーザー ID |
JobTitle | string | ユーザーの役職 |
string | ユーザーの電子メール ID | |
MailNickname | string | ユーザーのニックネーム |
mobilePhone | string | ユーザーの携帯電話 |
OfficeLocation | string | ユーザーの勤務先所在地 |
PostalCode | string | ユーザーの郵便番号 |
姓 | string | ユーザーの姓 |
TelephoneNumber | string | ユーザーの電話番号 |
UserPrincipalName | string | ユーザー プリンシパル名 |
AccountEnabled | boolean | アカウントの有効化されたフラグ |
BusinessPhones | string | ユーザーの会社の電話番号 |
最新情報は以下を確認してください。
検索条件のカスタマイズ
冒頭でも記載した通りデフォルト設定のままだと「tarou yamada」という文字列検索は条件一致しますが、「yamada tarou」と検索してもDisplayNameに一致する文字列が存在しないため何も表示されません。(DisplayNameが「tarou yamada」で登録されている前提の話)
ユーザ検索については'Office365ユーザー'.SearchUserという関数を使って行っているのですが、単純に検索文字列とユーザ情報のプロパティ情報を比較して一致する文字列があった場合に検索結果として表示されるような動きになっているようです。
なので、上記例だと最初に姓だけで検索して、名で絞り込む(tarou yamadaという文字列はDisplayNameには存在しない)みたいなことができないわけですね。。。
そこで、ユーザ検索を定義している関数部分をカスタマイズしてあげます。
設定箇所はUserBrowseGallery1のItemsプロパティです。
デフォルトの設定を削除して以下の関数に置き換えます。
If(CountA( Split( Trim(TextSearchBox1.Text), " " ))=1, Search( 'Office365ユーザー'.SearchUser({searchTerm: Mid(TextSearchBox1.Text,Find(" ",TextSearchBox1.Text,1)+1), top: 15}), Left(TextSearchBox1.Text, Find(" ", TextSearchBox1.Text,1)-1), "DisplayName"), 'Office365ユーザー'.SearchUser({searchTerm: Trim(TextSearchBox1.Text), top: 15}))
これで、「姓 名」でも「名 姓」でも検索できるようになります。
※注意:間は半角スペースの前提
何をやっているかというと、以下のIf分で入力された文字列を半角空白で分割して分割後の数をチェックしています。
If(CountA( Split( Trim(TextSearchBox1.Text), " " ))=1,
もしカウント=2なら、「姓 名」で検索、カウント=1なら姓だけで検索しているということです。
カウント=1の場合は単純に検索文字列で検索を書けます(以下の部分)
'Office365ユーザー'.SearchUser({searchTerm: Trim(TextSearchBox1.Text), top: 15})
カウント=2の場合は、検索文字列「姓 名」の中から「姓」の部分だけを抽出してまず検索を実行します。
その実行結果(複数レコード)のDisplayName属性に対して「名」の文字列が存在しているユーザだけを抽出するようにしています。
各関数(Search、Mid、Left、Find)等の使い方は公式サイトを見ればすぐわかると思います。
他の方の参考になれば幸いです。
以上、「PowerAppsでユーザ検索機能を実装する方法」でした。