
今回はSharePointで作った列にアカウント情報が入っている状態からユーザーによって制御する方法を考えます。
結果だだけ知りたいという方は
✔︎コレクションに抽出のためのデータテーブルをSharePointから持ってくる式
ClearCollect(Tbl,AddColumns(SharePointのリスト名,"Email",""));ForAll(AddColumns(SharePointのリスト,"Email",""),Patch(Tbl,ThisRecord,{Email:SharePointの個人が入った列名.Email}))
✔︎ユーザーの情報をコレクションに持ってきたSharePointのリストと比べる式
Filter(Tbl,Email=User().Email)
を使ってください。
PowerAppsに必須の知識PowerFX対応の学習本はこちら
PowerApps学習の本命・実際のアプリももらえる学習本
PowerApps学習方法一覧

SharePointのリストにおける「個人」とuser関数を比べる
Share Pointのリストで列を追加した際に、入力内容を個人に設定するとアカウント情報を入力できます。
この個人のデータはテーブル値となっていて内容は次のような形になります。
Claims | Department | Displayname | JobTitle | Picture | |
---|---|---|---|---|---|
i:0#.f|membership|アドレス名 | 部門 | 山田 太郎 | アドレス名 | 役職名 | 画像 |
となっています。
またPower Appsを使っている人の情報はuser関数を使うことでレコードとして取得できますがその内容は次のようになります。
Fullname | Image | |
---|---|---|
アドレス名 | 太郎 山田 | 画像 |
SharePointのリストからPower Appsのユーザーによってfilterをかけようとした場合にまず初めに思いつくのは名前での比較ですがご覧の通りDisplayNameとFullnameで姓名が逆に表記されるためここでの比較は困難です。色々な関数を組み合わせればできないこともないですが、かなり複雑になるのでやめておきましょう。
それよりもEmailの方が比べやすいのでこのEmailで比べましょう。
比べる対象はEmailにする
比較方法
SharePointの個人が入っている列の入力内容は個人の情報が入ったテーブルになります。またUser関数で取得できる値はレコード値となります。
比較演算子でテーブル同士の比較やレコード値同士の比較は行えませんので方針としては
- Sharepointのリストをコレクションに収める
- コレクションに収めたテーブルにEmail_の列を追加し個人からアドレスを持ってきて入力する
- User関数ユーザーのメールアドレスと比較を行う
となります。
ちなみに列名をEmailとしてしまうとのちに比較を行う時にエラーが発生するのとShare Pointのリスト内の個人の列ですでにEmailの列が作られているのでEmail_とすることでEmailと分けるようにしています。
Sharepointのリストをコレクションに収める
ClearCollect関数でSharePointのリストデータをコレクションに格納します。名前は今回はTblにしています。
ClearCollect(Tbl,SharePointのリスト名)
コレクションに収めたテーブルにEmailの列を追加し個人からアドレスを持ってきて入力する
Email列を追加したコレクションをClearCollect関数で作成します。Tbl2という名前でコレクションに格納します。
ClearCollect(Tbl2,AddColumns(Tbl,"Email_",""))
User関数ユーザーのメールアドレスと比較を行う
最後にForAll関数でEmailにアドレスのテキストデータを格納します。
ClearCollect(Tbl3,Tbl2);ForAll(Tbl2,Patch(Tbl3,ThisRecord,{Email_:SharePointの個人が入った列名.Email}))
Patch関数の第二引数にThisRecordとすることでレコードの値を内部的に取得してくれます。そのため、第三引数の後半ではテーブル名を入れずに列名のみでレコードが取得できます。そのため
SharePointの個人が入った列名=レコード値
となります。そのレコード値に
.Email
をつけることでレコードの中のレコード(ユーザ情報)のEmail列の値を取得していることになります。
おまけ:あと始末
ここまででコレクションがたくさんTbl、Tbl2、Tbl3とコレクションをたくさん作ってしまったので最後に作ったTbl3をTableに格納してTblとTbl2とTbl3を消去しておきましょう。
ClearCollect(Table,Tbl3);Concurrent(Clear(Tbl),Clear(Tbl2),Clear(Tbl3))
これで最終的にはTableというコレクションにEmail列が追加されたテーブルが出来上がります。
とはいえ順を追って関数をかくと
ClearCollect(Tbl,SharePointのリスト名);
ClearCollect(Tbl2,AddColumns(Tbl,"Email_",""));
ClearCollect(Tbl3,Tbl2);
ForAll(Tbl2,Patch(Tbl3,ThisRecord,{Email_:SharePointの個人が入った列名.Email}));
ClearCollect(Table,Tbl3);Concurrent(Clear(Tbl),Clear(Tbl2),Clear(Tbl3))
となります。これだと長くなりますので入れ子を使いまとめてしまうと次のような式になります。
ClearCollect(Tbl,AddColumns(SharePointのリスト名,"Email_",""));
ForAll(AddColumns(SharePointのリスト,"Email_,""),Patch(Tbl,ThisRecord,{Email_:SharePointの個人が入った列名.Email}))
Filter 関数で抽出する
では上の関数でTblというデータベースが作られた状況でFilterを使うと
Filter(Tbl,Email=User().Email)
となります。
使用しているユーザーの情報はuser()で取得できます。User()はユーザーの情報をレコードで返してくれるのでその中のEmail列の情報とTblのEmail_列の比較を行うことで抽出が可能となります。