はじめに
私のマシュマロにて以下のような質問をいただきました。
今回はこちらの回答をしていきます。
質問のようなアプリを作成してみる
リスト作成
SPOリストには[タスク]、[ユーザーとグループ]、[メールアドレス]・・・の項目があるようなので、わかっている[タスク]、[ユーザーとグループ]、[メールアドレス]の3つのフィールドを作成します。
文章内での説明から、
列名 | 列の種類 |
---|---|
タスク | 1行テキスト |
ユーザーとグループ | ユーザーまたはグループ |
メールアドレス | 1行テキスト |
で作成していきます。
タスクはデフォルト列であるタイトル列を利用することにします。
アプリを作成する
アプリは作成したリストから自動生成しました。
メールアドレス欄にユーザーとグループで選択したメールアドレスを設定する
質問の回答です。
質問の記載内容より、「ユーザーとグループ」で選択したユーザー(グループ)のメールアドレスを「メールアドレス」に設定すればいいと思いますので、それを設定していきます。
質問者さんの利用されたUser()関数は現在のアプリ利用者のユーザー情報を取得するための関数ですので、今回の用途には適さないですね。
Office365Usersコネクタでも行いたいことはできますけど、ユーザーとグループ列をItems
に設定してあるコンボボックスで選択されたユーザーを参照することで、その選択されたユーザーの情報を取得できますのでそれで取得しましょう。
「メールアドレス」のテキスト入力欄を変更していくわけですが、まずはプロパティの変更がブロックされているため解除します。
「ユーザーとグループ」で選択したユーザーのメールアドレスを「メールアドレス」のテキスト入力のDefault
に設定します。
「ユーザーとグループ」はDataCardValue5
という名前のコントロールなので、これを参照します。
Power Appsのコンボボックスのプロパティをみてみますと、コンボボックスで選択されたアイテムはSelectedItems
で取得できることがわかります。
ただ取得できるのはテーブルですので、以下のように記載してしまうとエラーになります。
テキスト入力の箇所にはテキスト型が設定されるべきなのに、テーブル型が設定されているというエラーですね。
これを回避するために
First(DataCardValue5.SelectedItems).Email
のように、テーブルの最初のレコードを取り出して、それのEmail
をテキスト入力に設定する。
でも解決できますが、この方法ですと、例えばユーザーとグループで複数の選択がなされたときに最初の1ユーザー(グループ)の情報しか表示できなくなってしまいます。
多分質問者さんの内容てきにこれでも問題なさそうな気がしますが、上記問題から今後機能拡充なのでユーザー列が複数選択できるようになった場合に困ってしまうと思いますので別の解決策も出しときます。
テキスト入力欄にはテキスト型を設定すればいいわけですので、テーブルの特定のフィールドの値を結合させてテキスト型にしてあげようと思います。
これを実現するためにConcat関数を利用します。
Concat(DataCardValue5.SelectedItems, Email & ";")
これにより、「ユーザーとグループ」で選択したユーザーのメールアドレスが「;」で結合されて表示されました。
もし、1ユーザーしか選択されていなかった場合や、複数のユーザーを選択した場合でも最後の「;」は表示したくないよ。という場合は以下のようにして最後の文字を消してあげます。
With( {txt:Concat(DataCardValue5.SelectedItems, Email & ";") }, Left(txt, Len(txt) - 1) )
これで、最後の一文字(今回でいうと区切り文字の「;」)を除去できます。
おまけ
ユーザーとグループでチェックをしたら自身が自動で設定されるようにする
こんな感じのチェックボックスを追加しておいて、このチェックボックスがチェックされたら自身をコンボボックスに設定するようにしたいと思います。
コンボボックスのデフォルト選択項目の設定箇所は、DefaultSelectedItems
なのでここに設定していきます。
次にSPOリストのユーザー列ですが、
- Claims
- Department
- DisplayName
- JobTitle
- Picture
の6つで構成されています。
省いてもいい項目もあるのですが、今回そこは説明しません。
チェックボックスが選択されていれば、現在のユーザーを設定し、そうでなければリストに設定されていたユーザーを表示するようにします。
If( !Checkbox1.Value, Parent.Default, { Claims: "i:0#.f|membership|" & Lower(User().Email), Department: Office365ユーザー.MyProfileV2().department, DisplayName: User().FullName, Email: User().Email, JobTitle: Office365ユーザー.MyProfileV2().jobTitle, Picture: User().Image } )
これにより、一々自分自身を検索しなくてもよくなったのでユーザーの操作性があがりますね。
おわりに
細かいところまで詳しく説明しようとして、ちょっと無駄なとこ多々あったかもです。
簡単にまとめると、「コンボボックスの値参照すれば欲しい値とれるよ」になります。
記載内容で不明点などありましたら追加で質問お願いします!
特になにも考えずマシュマロで質問募集してますけど、他のエンジニア系の方々は質問箱使ってますよね。
そちらの方が、私のブログとか読んでくれている人向けには回答しやすいんでしょうか?
誰か教えてー