Power AppsPower Platform

【Power Apps】コレクションを複数キーワードで絞り込む方法(AND検索・OR検索)

今回の記事では、Power Appsで作成したコレクションを複数キーワードで絞り込む(AND検索・OR検索)方法をお伝えします。

スポンサーリンク

前提・準備

データの準備

App > OnStartプロパティ に下記の式を入力します。

ClearCollect(
    colRecipe,
    {
        RecipeTitle: "トマトとキャベツの和風サラダ",
        RecipeDetails: "トマトとキャベツで作る簡単サラダです。さっぱりとした味わいで夏にぴったりです"
    },
    {
        RecipeTitle: "キャベツのクタクタ煮",
        RecipeDetails: "キャベツをじっくり煮込んだ一品です。簡単でごはんがすすみます"
    },
    {
        RecipeTitle: "にんじんの爽やかサラダ",
        RecipeDetails: "にんじんをオリーブオイルで和えたサラダです。すっぱさも病みつきになります"
    }
)
create-collection

App > OnStartを実行します を押すとコレクションが作成されます。

OnStartの実行(コレクションの作成)

コントロールの準備

サンプル用のコントロールを配置します。まずは以下のコードをコピーしてください。
(※右上の青いコピーボタンをご利用ください)

Screens:
  Screen1:
    Properties:
      LoadingSpinnerColor: =RGBA(56, 96, 178, 1)
    Children:
      - galRecipeList:
          Control: Gallery@2.15.0
          Variant: Vertical
          Properties:
            BorderColor: =RGBA(0, 18, 107, 1)
            DelayItemLoading: =false
            Height: =315
            Items: |-
              =Filter(
                  colRecipe,
                  CountRows(
                      Filter(
                          Split(
                              Substitute(
                                  txtSearch.Text,
                                  " ",
                                  " "
                              ),
                              " "
                          ),
                          Value in RecipeTitle
                      )
                  ) = CountRows(
                      Split(
                          txtSearch.Text,
                          " "
                      )
                  )
              )
            TemplateSize: =96
            Width: =1366
            Y: =366
          Children:
            - lblRecipeTitle:
                Control: Label@2.5.1
                Properties:
                  BorderColor: =RGBA(0, 18, 107, 1)
                  Font: =Font.'Open Sans'
                  Height: =87
                  OnSelect: =Select(Parent)
                  Size: =16
                  Text: =ThisItem.RecipeTitle
                  Width: =336
                  X: =96
                  Y: =3
            - lblRecipeDetails:
                Control: Label@2.5.1
                Properties:
                  BorderColor: =RGBA(0, 18, 107, 1)
                  Font: =Font.'Open Sans'
                  Height: =87
                  OnSelect: =Select(Parent)
                  Size: =16
                  Text: =ThisItem.RecipeDetails
                  Width: =868
                  X: =456
      - txtSearch:
          Control: Classic/TextInput@2.3.2
          Properties:
            BorderColor: =RGBA(0, 18, 107, 1)
            Default: =""
            Font: =Font.'Open Sans'
            Height: =64
            HintText: ="料理名で検索"
            HoverBorderColor: =RGBA(0, 18, 107, 1)
            HoverFill: =RGBA(186, 202, 226, 1)
            PaddingLeft: =15
            Size: =16
            Width: =398
            X: =93
            Y: =139
      - lblHeaderRecipeTitle:
          Control: Label@2.5.1
          Properties:
            BorderColor: =RGBA(0, 18, 107, 1)
            Font: =Font.'Open Sans'
            FontWeight: =FontWeight.Semibold
            Height: =60
            Size: =20
            Text: ="RecipeTitle"
            Width: =160
            X: =104
            Y: =284
      - lblHeaderRecipeDetails:
          Control: Label@2.5.1
          Properties:
            BorderColor: =RGBA(0, 18, 107, 1)
            Font: =Font.'Open Sans'
            FontWeight: =FontWeight.Semibold
            Height: =60
            Size: =20
            Text: ="RecipeDetails"
            Width: =200
            X: =463
            Y: =284

Power Appsの開発画面にて、スクリーン上で 右クリック > 貼り付け を選択すると、今回用に作成したサンプルコントロール類が表示されます。

コードの貼り付け
コントロールの配置

今回は上記のコントロール類を利用して説明していきます。

スポンサーリンク

OR検索

まずは簡単なOR検索から解説します。

結論

「空の垂直ギャラリー」のItemsプロパティに下記の式を入力してください。

Filter(
    colRecipe,
    !IsEmpty(
        Filter(
            Split(
                Substitute(
                    txtSearch.Text,
                    " ",
                    " "
                ),
                " "
            ),
            Value in RecipeTitle
        )
    )
)
OR検索式

※ ご自身のコレクションを利用する場合は、「colRecipe」(コレクション名)と「RecipeTitle」(検索する列名)を置き換えてご利用ください

解説

ざっくりとした流れは下記の通りです。

  1. 内側の「Split~ 」部分で、入力されたテキストをスペース(半角&全角)で分割し、検索キーワードを取得
  2. 外側の「Filter~」部分で、検索キーワードのいずれかが含まれている行をピックアップする

具体的には、検索キーワードが1つも含まれていない行は取得されず、1つでも含まれている行は取得されるという動きになります。
今回の例であれば上2行が取得されます。

検索キーワード入力(OR検索)
実行結果(OR検索)
スポンサーリンク

AND検索

続いてAND検索です。
式を見ても理解は難しいかと思いますので、何度か利用してみることをお勧めします。

結論

「空の垂直ギャラリー」のItemsプロパティに下記の式を入力してください。

Filter(
    colRecipe,
    CountRows(
        Filter(
            Split(
                Substitute(
                    txtSearch.Text,
                    " ",
                    " "
                ),
                " "
            ),
            Value in RecipeTitle
        )
    ) = CountRows(
        Split(
            txtSearch.Text,
            " "
        )
    )
)
AND検索式

※ ご自身のコレクションを利用する場合は、「colRecipe」(コレクション名)と「RecipeTitle」(検索する列名)を置き換えてご利用ください

解説

ざっくりとした流れは下記の通りです。

  1. 内側の「Split~ 」部分で、入力されたテキストをスペース(半角&全角)で分割して検索キーワードを複数取得
  2. 外側の「Filter~」部分で、すべての検索キーワードが含まれている行をピックアップする

具体的には、「入力された検索キーワードの数」と「RecipeTitleに含まれている検索キーワードの数」を比較して、同数の場合のみ取得されるという動きになります。

これによって、すべての検索キーワードが含まれている行のみを取得するという動きを実現できます。
今回の例であれば上1行のみが取得されます。

検索キーワード入力(AND検索)
実行結果(AND検索)
スポンサーリンク

まとめ

コレクションを複数キーワード(半角&全角スペース区切り)で絞り込む方法をお伝えしました。

Filter関数とIsEmpty関数/CountRows関数を組み合わせることで、AND検索やOR検索を実現することができます。
式を見てすぐに理解するのは難しいと思いますので、手元で動かしながら確認いただければと思います。

この記事は役に立ちましたか?

役に立った!
役に立たなかった...
フィードバックありがとうございました
スポンサーリンク
Hiromaru

普段からPower Platform・SharePointの技術を広めています!
デザインに力を入れて、見やすい・分かりやすい記事を投稿していきます

Hiromaruをフォローする
シェアする
Hiromaruをフォローする
タイトルとURLをコピーしました