🔀

Power Apps の IN 演算子による委任の警告を StartsWith() で解消する

2023/09/07に公開

前提

投稿の一覧を表示するギャラリー gryPosts と、投稿の題名で検索をかけるためのテキストボックス txtSearchByTitle があると考える。投稿を保持するデータソースとして posts がある。poststitle 列と content 列を含むものとする。

ここで gryPosts に表示される投稿数は多くなる可能性があるため、gryPosts には txtSearchByTitle に渡された題名が含まれる投稿を抽出する機能をつけたい。

実装

このとき、gryPosts には次のようにプロパティを設定すれば良い。なお、txtSearchByTitle は特段の設定が不要である。

Items = If(
    IsBlank(txtSearchByTitle),
    posts,
    Filter(
        posts,
        txtSearchByTitle.Value in title
    )
)

これで gryPoststxtSearchByTitle を参照して、指定された題名を含むような投稿のみを返す機能を実装できた。ここで txtSearchByTitle が空欄の場合は投稿全件を返すものである。

委任に関する警告の発出

問題がある。in 演算子は特定のデータソース(SharePoint Online など)で委任不可能(委任の警告が発出される)になる場合がある。今回はドキュメントの上では委任できるようであったが、Power Apps Studio 上では委任不可能のようであった。

このため in 演算子を使わない形にコードを改変することで、委任の警告を回避する。

回避策: inStartsWith()

in 演算子については、代わりに StartsWith 関数を用いる。定義は StartsWith(A, B) である。

StartsWith 関数はテキスト A がテキスト B で始まるかテストする関数である。例えば A = \mathrm{abcde} について B = \mathrm{abc} とした場合、テスト結果は true である。B = \mathrm{cde} とした場合は false である。

ここで内部処理は「テキスト A はテキスト B に含まれるか」ではなく「AB で始まるか」というふうに変わってしまうが、今回の場合はこの件は無視する。

なお、Filter 関数は委任可能である。

よって、gryPosts を以下のように改変する。

Items = If(
    IsBlank(txtSearchByTitle),
    posts,
    Filter(
        posts,
        StartsWith(title, txtSearchByTitle.Value)
    )
)

これで正常に委任の警告を回避できた。

Discussion