【Power Apps】さらっと流されがちな「委任に関する警告」と、「データ行の制限」の解説・検証 - APC 技術ブログ

APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【Power Apps】さらっと流されがちな「委任に関する警告」と、「データ行の制限」の解説・検証

はじめに

Power Platform推進チームの小野です。

Power Apps で関数を書いていて、「委任に関する警告」が表示されたことはないでしょうか?

委任の警告ポップアップ

あまりお目にかかりたくはないアイコンですが、エラーではなく警告なので、アプリの保存や動作に対して直ちに影響があるわけではないです。また、下記の修正方法にも書いてあるとおり、データ数が 2,000件以内であれば、制限の再設定を行うことで問題を回避できます。

委任の警告の詳細

そんなわけで、「委任に関する警告」はなんとなく回避できてしまうんです。データ数が 2,000件を超えない見込みであれば、警告が出ていても特に問題は起きない、みたいな言い方をされることもありますね。

とはいえ、Power Apps を正しく使いこなす上で、委任とデータ行の制限に対する理解は必要です。ここを理解するために、テストデータで動作を検証してみました。

用語解説

委任とは

誤解を恐れずに簡単に言うと、Power Apps 側ではなく、データソース側でフィルタをかけられることです。委任できるかできないか、なので、委任の状態は true / false になります。

learn.microsoft.com

委任できる場合は、データソース側でフィルタした状態のデータが Power Apps に渡されます。元のデータがどれだけたくさんあっても、データソース側でフィルタ処理されたデータを Power Apps は受け取り、結果として返します。フィルタを適切に設定することで、Power Apps に渡されるデータ量を小さくできるので、処理速度の向上も期待できるでしょう。

一方、委任できない場合は、データソース側のすべてのデータが Power Apps に渡されます。渡されたデータを Power Apps 側でフィルタ処理して、結果を返すことになります。Power Apps が受け取るデータ量が必然的に多くなるので、後述のデータ行の制限に引っかかりやすくなる、というわけですね。

委任できるとき・できないとき

委任が可能かどうかは、データソースと関数の組み合わせで決まります。委任できるデータソースと、委任できる関数を組み合わせた場合のみ、委任ができている状態になる形です。

Power Apps でよく使われるデータソースであれば、概ね委任できます。Excel, Microsoft Lists, Dataverse for Teams, Dataverse などですね。

委任の警告が出てきた場合は、委任できない関数を選んでいる可能性が高いと思われます。委任できる関数の方が多い印象ではありますが、たとえば Microsoft Lists に対しては、以下に挙げた関数は委任ができません(一例です)。

  • Search 関数:部分一致検索
  • CountRows 関数:レコード数カウント
  • FirstN, Last, LastN 関数:前方・後方から順にデータ取得 (First 関数は委任可)
  • Updateif, Removeif 関数:条件に一致するレコードの更新・削除

データソースと関数の組み合わせは無数にあるので、委任できるかどうかは都度確認するしかありません。たとえば、Dataverse for Teams だと、Search 関数や CountRows 関数は委任できますが、FirstN 関数は委任できませんでした。

※データソースや委任できる関数については、こちらの動画が参考になります。

www.youtube.com

ただ、動画の 2:30 あたりでも話されているとおり、本投稿での検証結果も含めて「鵜呑みダメゼッタイ!!!」です。

データ行の制限とは

データソースから取得できるデータの最大数を指します。デフォルトは 500 で、Power Apps のアプリごとに 1~2,000 の範囲で設定できます。

データ行の制限 設定

とはいっても、委任ができている前提であれば、ギャラリーとデータ テーブルは、データ行の制限を超えた件数を表示できます。複数レコードを表示する時はギャラリーを使うことが多いと思われるので、データ行の制限の影響を受けにくいのが実際のところですね。

データソースから値を取得を、ギャラリーで表示するのではなく、関数内で計算したり、変数に格納したりする場合に影響が出ることになります。

※ギャラリーとデータ テーブルがデータ行の制限を無視できるのは、画面に表示できないデータをあとで読み込む「遅延読み込み」が機能しているため、と推測されています。

ippu-biz.com

委任 と データ行の制限 の比較表

ここまでの情報を表で整理しておきます。委任は可否 (true / false)、データ行の制限は数値で表現できます。

委任 データ行の制限
概要 データソース側でのフィルタ可否 データソースから取得できる行数
状態 true / false 1~2,000
条件 データソースと関数の組み合わせ アプリごとの設定
例外 - ギャラリー、データテーブル
(制限されない)

委任とデータ行の制限は、それぞれ独立した概念である点が重要かと思います。委任できていればデータ行の制限を無視できる、とかではなく、データソースから渡されるデータ量が少なくなるのでデータ行の制限を下回りやすくなる、くらいの感覚です。委任できていてもフィルタが緩くてデータ行の制限に引っかかったり、委任できていなくてもギャラリーでの表示ならデータ行の制限を無視できたり、といったパターンがありえます。

検証

それでは、いくつかのパターンで、委任とデータ行の制限がどのように作用するか検証してみましょう。

データソースは、Microsoft Lists にある、都道府県の統計データテーブル(tdfk) です。デフォルトの並び順は都道府県コード順で、Power Apps 側では都道府県名・人口ランキング・人口数を表示しています。

また、アプリの設定でデータ行の制限を 5 に設定しました。都道府県テーブルには 47件のレコードがありますが、データ行の制限を無視できない表示方法の場合は、先頭から 5件までしか表示されなくなります。

アプリの設定>データ行の制限を 5 に

検証① データソースからギャラリーに直接表示

全件表示できます。関数を使っていないので委任は可能。表示先がギャラリー コントロールなので、データ行の制限を無視できます。以降の検証でもデータ取得結果はギャラリーで表示しています。

検証② SortByColumns 関数(委任可能)でソート

ソートされた状態で、ギャラリーに全件表示できています。SortByColumns 関数は委任可能です。

検証③ FirstN 関数(委任不可能)で人口上位トップ10

トップ5 までしか表示されていません。FirstN 関数は委任ができないので、データソース側から全データを取得してから、上位10行を表示する動きになりますが、データ行の制限でデータソースからは 5行しか取得できません。結果的に、取得してきた 5行をギャラリーですべて表示している状態になっています。

検証④ Filter 関数(委任可能)で人口上位トップ10

やりたいことは③と同じですが、こちらの方法なら問題なく表示できています。ソート済みのデータから、委任可能な Filter 関数を使って、人口ランキングが 10以内の行のみを表示しています。

検証⑤ ClearCollect 関数(委任不可能)を使ってデータソースから変数に格納

5件しか取得できていません。ClearCollect 関数がコレクション col_tdfk にデータを格納する際、データ行の制限によってデータソースから5件しか取得できていないためです。ClearCollect 関数は委任不可能ですが、このケースでは委任の可否というより、データ行の制限に引っかかっていることが原因です。

検証⑥ ClearCollect 関数(委任不可能)で、取得済みのデータから変数に格納

これも5件しか取得できていません。④ と同じ方法で取得した 10件のデータを、ClearCollect 関数で変数に格納しようとしています。ClearCollect 関数が ④ からデータを取得する際に、委任ができないため 10件のうち 5件しか取得できない、と解釈しました。Power Apps 内なら委任は関係ないかもと思ったんですが…

検証⑦ Search 関数(委任不可能)で部分一致検索

県がヒットして、正常に動作しているように見えますが、本来ヒットするはずの宮県が結果に含まれていません。これは、データ行の制限内で取得できた5件に対して、部分一致検索をかけているためです。参考として、前方一致検索の StartsWith 関数(委任可能)で同じ文字列を検索した結果を画面下部に載せています。

Power Apps で部分一致検索(Search 関数)を使う場合は、データ行の制限を意識する必要があります。委任ができて、Search 関数を代替できるような関数がないため。あるいは、Search 関数が委任できる Dataverse for Teams, Dataverse の利用を検討しましょう。

なお、委任ができない関数は複数ありますが、今回の検証で「委任に関する警告」が表示されたのは、部分一致検索の Search 関数のみでした。Search 関数の需要とリスクについて、Microsoft も認識している、ってことだと勝手に思っています。今後のアップデートに期待しましょう。

おわりに

委任 と データ行の制限について、理解を深めることができました。同じ悩みを持つ人のためになれば幸いと思ってブログに投稿していますが、検証・アウトプットすることで自分の理解度が飛躍的に高まりますね。

警告は出なくても制限されているパターン③⑤⑥や、一見正常そうに見えて実は制限されている要注意なパターン⑦を再現することができました。Microsoft Learn にも記載されているとおり、アプリの検証を行う際に、データ行の制限を一時的に 1にしてみるのは効果的だと思いました。

learn.microsoft.com

想定した結果が返ってこない場合は、パターン④のような方法で、委任不可能な関数を委任可能な関数で置き換えることで解決できるかもしれません。やりたいことを明確にした上でプロセスを分解して、他の関数で置き換えられないか確認してみるとよさそうです。

なお、今回はフィルタする列の型が 1行テキストと数値だったので、比較的単純な例でした。複数行テキストや URL などは委任が苦手で、データソースによっても委任可否が変わってきます。関数・データ型・データソースの組み合わせごとに、都度検証してから扱うのが確実だと思われます。