6.5K Views
September 30, 24
スライド概要
Power AppsのデータソースとしてSharePointリストを使う場合避けて通れない”委任”について検証の結果をまとめたものです。
“委任”と徹底的に向き合ってみた (2024年8月 検証の記録) 2024年8月31日(土)9月29日(日) JPAUG広島「Power Appsでハッカソンしたいけぇ #8」
自己紹介 • ハンドルネーム:yukio • X(旧Twitter):@yukio_365 • ブログ:https://yukio-ms365.hatenablog.com/ ・山口県出身・在住、1990年生まれ ・県内の非IT企業勤務中の2022年3月頃にPower Platformに出会い、夢中で勉強した結果、 社内で幾つものアプリ/フローを運用する市民開発者に →2024年9月~Power Platform関連の仕事にフルリモ転職 ・趣味はコントラバス演奏(オーケストラ、吹奏楽団)今はお休み中だがいつか復帰したい。 【チョットデキル】 Power Appsキャンバスアプリ Power Automate(クラウドフロー) Power Automate for desktop 【勉強中】 Power Appsモデル駆動型アプリ Dataverse Power BI
免責事項 • 今回の情報は、 SharePointリストをデータソースにしたPower Appsキャンバスアプリにおける “委任”について 個人的に検証した結果をまとめたものです(検証時期:2024年8月) • 不足や間違いを含む場合があります(むしろ参加者の皆様からご意見や経験談 を頂いてこの資料を完成に近づけたいです。よろしくお願いいたします。) • 今後のアップデートにより仕様が変わる可能性があります。 • この資料はあくまで参考情報として見ていただき、実際の挙動はご自身で手を 動かして確かめてください。
参考(1)Microsoft公式、書籍 • キャンバスアプリでの委任について(Microsoft Learn) https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview • SharePoint – Connectors(Microsoft Learn) https://learn.microsoft.com/ja-jp/connectors/sharepointonline/#power-apps-delegable-functions-andoperations-for-sharepoint • Power Apps入門 ~手を動かしてわかるローコード開発の考え方~(出版:翔泳社 著:小玉純 一/山田晃央) https://www.shoeisha.co.jp/book/detail/9784798173955 • ひと目でわかるPower Apps ~ローコードで作成するビジネスアプリ入門~ 第3版(出版:日経 BP 著:奥田理恵) https://bookplus.nikkei.com/atcl/catalog/23/08/01/00929/ ※敬称略
参考(2)有志の登壇資料、ブログ他 • あなたが作りたいアプリ、どのデータソースを選べばいいか教えます(Ryota Nakamura_りなた む) https://www.docswell.com/s/rinatamu/KXQGPZ-PowerApps-delegate • よく聞くけど、SharePointリストの5,000件問題ってなんなの?(太田浩史) https://www.docswell.com/s/hrfmjp/5QNNN5-2022-05-09-124548 • SharePoint リストと比較した際の Microsoft Dataverse のメリット(Takashi_Masumori(益森 貴 士)) https://qiita.com/Takashi_Masumori/items/4189db25d20538b91212 • PowerApps│SharePointリスト5000件問題を解決する2つの方法(七草あんこ) https://anko7793.com/2022/06/1697/ • Distinct関数は委任対象外なので気を付けよう。(ヨウセイ) https://youseibubu.com/apps/distinct/ ※敬称略
“委任”ってなに?
Learnにはこう書いてある キャンバスアプリでの委任について(Microsoft Learn) https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview
Learnにはこう書いてある キャンバスアプリでの委任について(Microsoft Learn) https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview
Learnにはこう書いてある キャンバスアプリでの委任について(Microsoft Learn) https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview
Learnにはこう書いてある キャンバスアプリでの委任について(Microsoft Learn) https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview
Learnにはこう書いてある しれっと書いてあった Distinct関数は委任対象外なので気を付けよう。(Power Apps Tips ログ) https://youseibubu.com/apps/distinct/ キャンバスアプリでの委任について(Microsoft Learn) https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview
Learnにはこう書いてある キャンバスアプリでの委任について(Microsoft Learn) https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview
なんとなーくわかる気がするが… (でもこれ読み込んで理解できるようにならないといけないのが今後のわたし)
参考文献や有志の方々の資料を読んだ上で 自分なりに説明してみる ※事象を限定して説明しています。 ※間違いを含む場合があります。あったら教えてください
【前提】データ行の制限 • Power Appsキャンバスアプリが、データソースから“一度に取ってこれる” 最大の件数 • 初期値は500件、最大で2000件まで増やせる
「データ行の制限」はなぜ存在する? • Copilotに聞いてみたらこんな回答だった
SPOリストはPower Fxの全てを知らない • 例えば、キャンバスアプリにギャラリーやデータテーブルを置いて、Itemsプロ パティにFilter関数を書くとする。 • Power Appsは、基本的に自分でFilter処理はせず、データソース(SharePointリ スト)にお願いする形をとっている。 • これが「委任する」ということ • しかし、SharePointリストは、Filter関数に書いてあることでも、知っているこ とと知らないことがある。
SPOがFxを理解してくれた場合 • SharePointリストは、Power Appsからの指示を理解して、Filterした結果を Power Appsに返してくれる ●●のデータちょうだい なるほど。結果これやで
ただし… • 委任できる関数でFilterした結果すらも500(2000)件を超えてしまうと、意図 する結果にならない ●●のデータちょうだい なるほど。結果は2500件あるで (2000行しか来ない)
SPOがFxを理解できない場合 • 黄色い波線で、理解できない旨を主張してくる(たまに知ってるふりをす る) • SharePointリストは、Power Appsからの指示を理解できないので、データソー ス全件をPower Appsに返して「自分で検索せい!」と丸投げしてくる ●●のデータちょうだい (全件のつもり) 言ってる意味が分からん 全件渡すから自分で検索せい!
SPOがFxを理解できない場合 • でも、先述の通り、Power Appsのキャンバスアプリが“一度に取ってこれ る”データ行は500行(設定で2000件まで増やせる)以下しかないため、全 件と言いながら全件ではない可能性がある →全件でなかったら、意図する結果にならない ん?これって本当に データソース全件? (500行しか手元にない) (本当は100万行ある) 何やさっきの条件指定 知らんがな・・・
SPOがFxを理解できない場合でも… • でも、Power Appsは、取り込んだデータを自身でFilter処理することもできる。 • データソースが全件渡してきても、それが「ちゃんと全件」だったらOKとい うことになる。 ●●のデータちょうだい 面倒臭いなあ 自分でFilterす るか… (ちゃんと全件) 言ってる意味が分からん 全件渡すから自分で検索せい! (全体で50行しかない)
つまり・・・ 「総件数が絶対に2000件いかない」 データソースであれば 実は委任問題は気にしなくても良い (本末転倒だけどこれが本質) (前職ではこのスタンスでアプリ作ってた)
今回作った検証用SharePointリスト • インデックスありとなし 一応2つ作成
レコードはPower Automateで自動的に作成 こうしてできたリスト の行数: 約38,000件(9/25現 在)
検証用アプリ • モダンコントロールの「テーブル」が大活躍(実際のアプリの動きはイベント 参加者限定)
委任を検証するときは • 先述の「データ行の制限」を極端に減らすことがあります。
検証(1) Filter/LookUp関数 ※全てを網羅できているとは限りません
テキスト型列Filter/LookUp 委任可否 ここに何を入れるか 記述 Filter 委任 LookUp 委任 備考 タイトル = ●● 〇 〇 タイトル <> ●● × × StartsWith(タイトル , ●●) 〇 〇 EndsWith (タイトル , ●●) × × ●● in タイトル ●● exactin タイトル × × in:大文字小文字を無視 exactin:大文字小文字が一致する文字列のみを識別 IsBlank(タイトル) × × 「タイトル = Blank()」なら委任〇 !IsBlank(タイトル) × × 「タイトル <> Blank()」でも委任×
選択肢型列Filter/LookUp 委任可否 ここに何を入れるか 記述 Filter 委任 LookUp 備考 委任 選択肢.Value = “●●” 〇 〇 選択肢.Value <> “●●” × × StartsWith(選択肢.Value , “●●”) × × EndsWith (選択肢.Value , “●●”) × × “●●” in 選択肢.Value “●●” exactin 選択肢.Value × × in:大文字小文字を無視 exactin:大文字小文字が一致する文字列のみを識別 IsBlank(選択肢.Value) × × 「選択肢.Value = Blank()」なら委任〇 !IsBlank(選択肢.Value) × × 「選択肢.Value <> Blank()」でも委任×
日付型列Filter/LookUp 委任可否 ここに何を入れるか 記述 Filter 委任 LookUp 備考 委任 日付 = ●● 〇 〇 日付 <> ●● 〇 〇 日付 < ●● 〇 〇 不等号は逆向き(>)や「=」付きでもOK IsBlank(日付) × × 「日付 = Blank()」なら委任〇 !IsBlank(日付) × × 「日付 <> Blank()」なら委任〇
日付+時刻型列Filter/LookUp 委任可否 ここに何を入れるか 記述 Filter 委任 LookUp 備考 委任 日付時刻 = ●● 〇 〇 日付時刻 <> ●● 〇 〇 日付時刻 < ●● 〇 〇 不等号は逆向き(>)や「=」付きでもOK IsBlank(日付時刻) × × 「日付時刻 = Blank()」なら委任〇 !IsBlank(日付時刻) × × 「日付時刻 <> Blank()」なら委任〇
ユーザー型列Filter/LookUp 委任可否 ここに何を入れるか 記述 Filter LookUp 備考 委任 委任 ユーザー.Email = ●● 〇 〇 ユーザー.Email <> ●● × × StartsWith(ユーザー.Email , ●●) 〇 〇 EndsWith(ユーザー.Email , ●●) × × ●● in ユーザー.Email ●● exactin ユーザー.Email × × in:大文字小文字を無視 exactin:大文字小文字が一致する文字列のみを識別 IsBlank(ユーザー) × × ユーザー.Email=Blank()等なら委任〇 !IsBlank(ユーザー) × × ユーザー.Email<>Blank()等でも委任× ※「.Email」は「.DisplayName」等でも可
数値型列Filter/LookUp 委任可否 ここに何を入れるか 記述 Filter 委任 LookUp 備考 委任 数値 = ●● 〇 〇 ※データ行の制限以上表示できる? 数値 <> ●● 〇 〇 ※データ行の制限以上表示できる? 数値 < ●● 〇 〇 ※データ行の制限以上表示できる? StartsWith(数値 , ●●) × × EndsWith(数値 , ●●) × × IsBlank(数値) × × 数値 = Blank()なら線は消えるけど委任× !IsBlank(数値) × × 数値 <> Blank()なら線は消えるけど委任×
はい/いいえ型列Filter/LookUp 委任可否 ここに何を入れるか 記述 Filter 委任 LookUp 備考 委任 はい/いいえ = ●● 〇 〇 はい/いいえ <> ●● × ×
検証中おかしな動きを見せた • 件数が多いデータソースで、データ行の制限も多い(2000件等)時、委任できな いFilterと委任できるFilterを交互に切り替えたときに正しい結果が取れない (ことがある) ※インデックスがあるリストでも改善されなかった StartsWith(委任〇)で「2」から 始まるものが抽出されている →EndsWith(委任×)に切り替え ても表示されるレコードが変わら ないことがある ※起きる時と起きない時がある ※何度か切り替えると正しく表示 される ※委任×→委任〇にした時も起き る時があった
検証(2) テーブル(レコードセット)取得系関数 ※全てを網羅できているとは限りません
テーブル(レコードセット)取得系関数 委任可否 関数 関数の説明 委任 Search 検索(Filter+inとほぼ同じ) × Sort テーブルを並べ替え(単一条件) △ 5000件以上のリストでエラー →インデックス付きリストなら OK SortByColumns テーブルを並べ替え(複数条件も △ 可) 5000件以上のリストでエラー →インデックス付きリストで、 かつ、条件が1つだけならOK FirstN 先頭からN個のレコードセット × LastN 末尾からN個のレコードセット × Distinct 重複を省いた単一列テーブル × Choices 選択肢列の一覧を返す 〇? 単一選択の場合ちゃんと動くが、 複数選択可能な列だとどうなるか?要検証 備考 公式にも有志の方の記事にも 「委任できない」と書いている がちゃんと動く Choices関数(Microsoft Learn) https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-choices
Sort、SortByColumnsで出たエラー 【前提】リストの行数が5000件を超えている ※Sort関数 インデックス付きリストだとエラー出ない ※SortByColumns関数 ※SortByColumns関数 インデックス付きリストで単一条件だとエラーでない Sort および SortByColumns 関数(Microsoft Learn) https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-sort
リスト ビューのしきい値 ※5000件以上あるリストの設定画面 ※件数が少ないリストの設定画面
これがいわゆる「5000件問題」?
これが5000件問題かどうかは知らんけど • 5000件問題、インデックスについてはこちらを参照! よく聞くけど、SharePointリストの5,000件問題ってなんなの?(太田浩史) https://www.docswell.com/s/hrfmjp/5QNNN5-2022-05-09-124548#p14 PowerApps│SharePointリスト5000件問題を解決する2つの方法(七草あんこ) https://anko7793.com/2022/06/1697/ ※敬称略
検証(3) レコード取得系関数 ※全てを網羅できているとは限りません
レコード取得系関数 委任可否 関数 関数の説明 委任 First 最初のレコードを取得 〇 Last 最後のレコードを取得 × 波線は出ないが、データ行の制 限に依存する(2000件にした時 は2000件目がLastとして取得さ れる) Index N番目のレコードを取得 × 波線は出ないが、データ行の制 限に依存する(2000件にした時 に2001番目以降のレコードを指 定しようとするとエラーが出 る) ※Index関数で出たエラー(2001件目を取ろうとしたら) 備考
検証(4) 値取得系関数 ※全てを網羅できているとは限りません
値取得系関数 委任可否 関数 関数の説明 委任 CountRows 行数をカウント × Sum 合計 × Average 平均 × Max 最大値 × Min 最小値 × 備考 ※いずれもデータ行の制限内(2000件なら先頭2000件)の中で計算した数値を出してくる
件数の多いSharePointリストを扱う時 私ならこうする
コレクションを活用する • コレクションならPower Appsキャンバスアプリ内部で完結するので、委任を気にす ることなく様々な操作を行える(Search等も使い放題)し、先述したおかしな動き も(たぶん)起きない。 【ポイント】 ・委任できる関数を使って、コレクションに入れるデータの件数を出来る限り少なくすること 【注意】 ・コレクション内のデータを更新してもSharePointリスト上のデータは更新されない ・委任できる関数でFilterした結果すらも2000件を超えるデータソースだと意図する動きをしない • 前職での事例を紹介 ※イベント参加者限定(資料のみ閲覧の方ゴメンナサイ…)
まとめ
SharePointリスト、意外と優秀(失礼)だが… • 今回の検証を通して、自分で手を動かしたことで分かることが多くあった • 今までは「委任できる関数を使って、2000件以内にしてPower Appsに持ってく ることができれば何をしてもOK」と思ってたが、件数が膨大になってくると 不都合が出る(インデックス列を追加することで軽減は可能だが、根本的な解 決策ではない)ことがわかった • それを気にしながら作り続けるよりかは、有償プランつけてDataverse(委任大 得意)が使えればベスト • Dataverse for Teamsも検討に値する
SharePointリスト以外の委任を調べたかったら? • りなたむさんのこの資料を確認! ※素晴らしい資料ですが、あくまで参考情報として、実際の動きは自 分で確かめてください。 https://www.docswell.com/s/rinatamu/KXQGPZ-PowerApps-delegate
ご清聴ありがとうございました