PowerAppsでユーザの情報でリストの抽出を行う方法
スポンサーリンク

今回は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のリストで列を追加した際に、入力内容を個人に設定するとアカウント情報を入力できます。

この個人のデータはテーブル値となっていて内容は次のような形になります。

ClaimsDepartmentDisplaynameEmailJobTitlePicture
i:0#.f|membership|アドレス名部門山田 太郎アドレス名役職名画像

となっています。

またPower Appsを使っている人の情報はuser関数を使うことでレコードとして取得できますがその内容は次のようになります。

EmailFullnameImage
アドレス名太郎 山田画像

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_列の比較を行うことで抽出が可能となります。

スポンサーリンク
社会人ということを言い訳にしていませんか

社会人だから学ぶ時間がない

そんなことを言い訳に勉強をすることを諦めていませんか。
そんな状態ではいけないということはあなた自身が一番知っているはずです。

社会人だからこそ学ぶ必要がある。そんな社会人に送る学習ツールがこちらです
↓↓↓

おすすめの記事