【Power Apps Tips!】フィルター ANDとORで絞込み

Power Apps 技術ブログ

はじめに

Power Appsのキャンバスアプリのギャラリーなどに表示するデータを、テキスト入力、ドロップダウンや日付コントロールなどで複合的にフィルターをしたい場合があります。
IF文で条件を切り分けて記載すると可読性、保守性の問題があるので、AND、ORのフィルター構文で実装するのが推奨されます。

サンプルではSPOリスト上での実装を前提に記載しています。(FilterのInやSearchの含む検索はSPOリストでは委任対象外なのでStartsWithで前方一致検索の実装)

 

複合的なフィルターサンプル

複合的な検索フィルターをAND,ORで一度のFilterで記載

AND、OR フィルター

書き方の例とは以下です。カンマがANDで || がORになります。
また、AND()、OR()で囲む書き方もあります。
どちらも同じ結果となります。どちらかで統一すれば可読性・保守性が上がるのでお勧めです。

サンプル項目の指定が空の場合はフィルターなし、値ありが複数項目ある場合の例


Filter(<データソース>,
  項目1の指定が空 || 項目1が指定の値
 ,項目2の指定が空 || 項目2が指定の値,
・・・)

ANDとORの書き方で以下でも同じ結果となる
Filter(<データソース>,
 AND(
  OR( 項目1の指定が空 , 項目1が指定の値 )
   , OR(項目2の指定が空 , 項目2が指定の値)
  ,・・・))

・カンマ区切りで式をAND条件でつなげれる。すべての条件がTRUEとなるデータが返ってくる。
・式の結果がTRUEとなる場合(特定のコントロールが空→TRUEなど)はすべてのデータが対象となる。
・||またはOR()でいずれかの場合にTRUEという書き方が出来る。
・ANDはいずれもTRUEだったらTRUE、ORはいずれかがTRUEならTRUEになる。

公式の構文は以下です。
Power Apps の Filter、Search、LookUp 関数 (動画を含む) – Power Platform | Microsoft Learn

シンプルな実装サンプル

上記だとちょっとわかりずらいので以降簡単なサンプルを作って実装例を掲載します。

サンプル・フィルター対象
①区分(社員、BP、個人)をDropdownKubunで指定する

・ギャラリーのItems
Filter(人材スキルリスト,
IsBlank(DropdownKubun.Selected) || 区分.Value =DropdownKubun.Selected.Value
)

最初の条件でドロップダウンの選択が空ならTRUEとなります。
OR条件はいずれかがTRUEであれば結果はTRUEとなるので、条件がTRUEとなるレコード
→すべてのレコードとなり、フィルターなしですべて返却されるとなります。

ドロップダウンに値を指定すると以下のように指定のレコードだけが返されます。


複数項目の複合フィルターサンプル

複数の種類のコントロールでの複合フィルターのサンプルです。いずれも空の場合はその項目はフィルターなしとなる動作です。サンプルではテキスト入力はStartsWithで前方一致し、入力がある場合は氏名またはメールどちらかが一致するものとしています。このように一つの入力コントロールで複数項目への検索も可能です。
以下のように行を分けても6行くらいで書けます。

  1. 区分(ドロップダウン) →社員、BP,個人
  2. 期間開始(日付コントロール) →指定日付より開始時期が後のものがTRUE
  3. 期間終了(日付コントロール) →指定日付より開始時期が前のものがTRUE
  4. 名前またはメール(テキスト入力) →氏名またはメールに対して前方一致するものがTRUE

CodeFilter(
人材スキルリスト,
IsBlank(DropdownKubun.Selected) || 区分.Value = DropdownKubun.Selected.Value,
IsBlank(DatePickerStart.SelectedDate) || 開始時期 >= DatePickerStart.SelectedDate,
IsBlank(DatePickerEnd.SelectedDate) || 開始時期 <= DatePickerEnd.SelectedDate,
IsBlank(TextInputNameORMail.Text) || StartsWith(氏名,TextInputNameORMail.Text) || StartsWith(メールアドレス,TextInputNameORMail.Text)
)

複合的な検索フィルターをAND,ORで一度のFilterで記載

Ifで実装した場合は数百、数千行になるケースもあり推奨されない

 IF文で分岐してネストして書いている場合はこの段階4,5個くらいですでに実装が大変なことになっています。実際に数千行の実装などを見たこともあります。記載は割愛しますが、そういった実装は保守性・可読性・パフォーマンスがよくありませんのでお勧めできません。

日付でフィルター

まずは開始日が StartとEndの日付コントロールの範囲のものでフィルターしてみます。
この際にEndが指定なしの場合はStartのフィルターのみが有効で逆もしかりです。どちらも指定すればその範囲の日付のデータが返却されます。また以下の例だと開始日がそもそも空のデータは除外されています。

期間開始を指定

追加で期間終了を指定

区分でフィルター(ドロップダウン)

上記に加えて区分を指定します。どちらにも一致するレコードが返されます。

日付に追加で区分を指定(個人)

日付に追加で区分を指定(社員)

テキスト入力でフィルター(複数列を前方一致)

上記に加えて、名前、アドレスに任意の値を入れます。
この例では氏名とメールアドレスいずれかに前方一致するものとしています。

加えて、「エヌ」で検索 →氏名、またはメールに前方一致が対象

加えて、「nsurf」で検索 →氏名、またはメールに前方一致が対象

上記のように複合的に指定した条件に一致したレコードを表示することが出来ます。
テキスト入力以外をクリアした場合はこの部分だけ有効なフィルターとなります。

他をクリアして「nsurf」で検索 →氏名、またはメールに前方一致が対象

自社サンプルアプリについて

以前自社で開発した人材スキル管理アプリでは、上記よりさらに複合的な内容のフィルター実装をしています。
このアプリではさらに柔軟な検索として、複数コンボボックスの値が複数選択肢に含まれるものという、テーブル対テーブルの含む検索も取り入れているため、委任警告を無視できる2000件までのデータを前提に実装しています。この実装ではデータソースがDataverseでも委任警告が出るので、やるなら警告無視ORコレクション化しての対応となります。

ドロップダウン以外にもコンボボックスで複数値(C#、Javaなど)が言語のいずれかに含むという検索も実装している。

テキスト検索では、含む検索で、氏名、所属、最寄り、勤務先のいずれかに一致すれば対象としている。かつ、対象の場合はその項目を色付け


おわりに

今回はAND、OR検索を使ってギャラリーフィルターを実装する方法のご紹介でした。
IF文ネストの場合だと項目少ないケースでは問題とならない場合がありますが、検索対象項目が増えるに伴い同じような内容の分岐が増え、数百、数千行のコードとなる場合もあります。可読性、保守性が悪く工数もかかるのでオススメできませんので、本投稿内容のAND、ORを活用しましょう。

※自身が個人ブログで投稿している内容をリライトしております(転用ではありません)

Power Platform コンサルティングサービスについて

本サービスはPower Platform(主にPower Apps、Power Automate)をご利用のお客様において、開発時や運用時のお困りごとに対し、チャットやTV会議を用いてのQA対応やアドバイス、サンプルコードのご提供などの業務サポートを行い、お客様のDX化推進業務を強くサポートするサービスとなります。

導入事例


今回ご紹介したアプリや本ブログにご興味をお持ちになられましたら、技術支援や同様のカスタマイズ開発など、各種ご支援させていただきますので、お気軽に「お問い合わせフォーム」よりお問い合わせください。
今後も自社で開発したお役立ちアプリや技術支援を行ったアプリのご紹介など、定期的に更新を行ってまいります。

関連記事