欲しいアプリは自分で作る!

Power Platform や Azure などを利用して作成した業務アプリや趣味アプリなどをご紹介します。

Power Apps のフォームで組織の特定部署のユーザーをドロップダウンで選択できるようにする方法

アカウント数が 1000 以上ある場合は、別のアプローチが必要になりますので、ご了承ください。




どうも、じゅんじゅんです。



弊社では現在 Power Apps 勉強会を開催しているのですが、その中で受講者から
「同じ部署の社員をプルダウンで選択できるようにしたい」
と相談がありました。

新しい画面から「人々」を追加することで検索可能な画面を作成することはできるのですが、自分で作成したテーブルをもとにフォーム画面で同機能をシンプルに実装したいという要望もあるかと思い、方法を模索してみました。

せっかくですので、Teams 上で利用できる Power Apps を用いてみようと思います。


手順

「人」型の列が選択できないので、ここでは Email を格納することにします。
予め、ユーザーのメールアドレスを格納するメール列「userEmail」を用意しておきます。
f:id:jn-kodama:20201125154146p:plain f:id:jn-kodama:20201125165428p:plain

データのタブから、Office 365 ユーザー コネクタを追加します。 f:id:jn-kodama:20201125165530p:plain f:id:jn-kodama:20201125165613p:plain

では、userEmail 列をドロップダウンから社員名で選択できるようにしていきます。
まずはカードのコントロールの種類をドロップダウンに変更します。 f:id:jn-kodama:20201125165818p:plain f:id:jn-kodama:20201125165905p:plain

これだけだと、ドロップダウンの中身が空っぽなので、ここに先ほど追加した Office 365 ユーザー コネクタを適用します。
ドロップダウンの Items プロパティは親(=データカード)の AllowedValues を参照しているので、そこを修正します。 f:id:jn-kodama:20201125170021p:plain

データカードのロックを外して… f:id:jn-kodama:20201125170107p:plain

データカードの AllowedValues プロパティに以下を記載してみましょう。

Office365ユーザー.SearchUser()

f:id:jn-kodama:20201125170155p:plain


これは今どういう状態かというと、こんな感じです。
まるで、ドロップダウンにテーブルが突っ込まれたかのような状態。

f:id:jn-kodama:20201125170720p:plain

Office 365 ユーザー コネクタの SearchUser を利用すると、ユーザーの情報(表示名、メールアドレス、部署名など)を取得することができますが、これも要は表示名やメールアドレス、部署名などの "列" を持つテーブルなんですよね。
この観点で画面を見てみると、以下の作業の意味がご理解いただけるかと思います。


まずは Update プロパティのエラー。
これは、フォームからデータを登録する際に、ドロップダウンに突っ込んだユーザーテーブルのどの列を Update するのか、列名がテーブルと合っていないために発生したエラーです。 f:id:jn-kodama:20201125170922p:plain

この場合は、Mail 列を Upload しますので、Value を Mail に書き換えれば OK です。 f:id:jn-kodama:20201125171024p:plain

続いて、ドロップダウンに何も表示されていないことに気付くと思います。
これも、ユーザーテーブルのどの列をドロップダウンに表示させるかの設定が意図通りではないために起こっています。
ドロップダウンを選択し、Items の下にある Value で、表示したい列を選択します(この場合は DisplayName でしょうか)。 f:id:jn-kodama:20201125171238p:plain f:id:jn-kodama:20201125171321p:plain

最後にもう一つ。
この状態で一度ユーザーを選択してデータ登録すると分かるのですが、再び修正しようとすると先ほど登録したユーザーがドロップダウンで選択されていないことに気付くと思います。
これは、ドロップダウンの初期値、つまりその親のデータカードの Default プロパティの設定(=ThisItem.userEmail)が、ドロップダウンで表示している列(DisplayName)と一致していないために発生します。

ということで、データカードの Default プロパティを修正します。
ここでやりたいのは、登録されたメールアドレスの情報を用いてユーザーの表示名を取得すること。
先ほど利用したコネクタをここでも利用します。

First(Office365ユーザー.SearchUser({searchTerm: ThisItem.userEmail})).DisplayName

f:id:jn-kodama:20201125171557p:plain

ここでやっているのは、先ほどの Office 365 ユーザー コネクタで登録されたメールアドレスをもとにユーザー情報を抜き出し、その DisplayName を参照しているだけです。
抜き出したユーザー情報を First 関数で包んでいるのは、抜き出した結果が何件であれ配列で取得できてしまうためです。


さて、ドロップダウンを選択してみましょう。

…あれ?表示件数が少ない…?? (弊社の場合は約 600 アカウントあるはず) f:id:jn-kodama:20201125171708p:plain

調べたところによると、どうやら Office365ユーザー.SearchUser() と記載するだけでは、先頭の 100 件しか拾ってくれないようです(最大 999 件まで増やせる)。

参考:
www.powerappsug.com

ということで、最大限取得できるように修正します。
(逆に言うと、1000 ユーザー以上いるテナントだとこの方法は使えません orz)

Office365ユーザー.SearchUser({top:999})

f:id:jn-kodama:20201125171744p:plain ※ 1000 以上の値を入れるとエラーになります。

f:id:jn-kodama:20201125171849p:plain

これで、まずは全ユーザーを選択できるようになりました。
一通り、選択や登録、修正が正常に行えることを確認してみてください。


最後に、特定の部署のユーザーだけを選択できるようにしてみます。

残念ながら、Office 365 ユーザー コネクタ内では部署検索ができないため、Office 365 ユーザー コネクタで抽出した全ユーザー情報から、特定の部署のみをフィルタリングします。
Office 365 ユーザー コネクタで抽出した全ユーザー情報もひとつのテーブルですので、これに対して素直に Filter 関数を適用します。
Office 365 ユーザー コネクタで抽出した全ユーザー情報には部署情報も含まれているので、

Filter(Office365ユーザー.SearchUser({top:999}), Department = "営業局営業部")

f:id:jn-kodama:20201125172237p:plain ※ドロップダウンの表示を部署名に切り替えています。

ちなみに以下が Filter をかける前の画面です(ドロップダウンの表示は上記と同じく部署名にしています)。 f:id:jn-kodama:20201125172343p:plain

なお、「A部署またはB部署」としたい場合は、Filter 関数の第二引数を Or 関数で括れば制御可能です。

f:id:jn-kodama:20201125172423p:plain

まとめ

Teams × Power Apps の利用においては、全社的というよりはプロジェクトメンバーや一部部署での利用が想定されると思います。 選択する人数によっては検索窓を設けた方がいい場合もあるかと思いますので、皆さまのご利用シーンに合えば是非試してみてください。



欲しいアプリは欲しい人が作る時代へ。

何かのご参考になれば幸いです。