今回の記事では、Power Appsで作成したコレクションを複数キーワードで絞り込む(AND検索・OR検索)方法をお伝えします。
前提・準備
データの準備
App > OnStartプロパティ に下記の式を入力します。
ClearCollect(
colRecipe,
{
RecipeTitle: "トマトとキャベツの和風サラダ",
RecipeDetails: "トマトとキャベツで作る簡単サラダです。さっぱりとした味わいで夏にぴったりです"
},
{
RecipeTitle: "キャベツのクタクタ煮",
RecipeDetails: "キャベツをじっくり煮込んだ一品です。簡単でごはんがすすみます"
},
{
RecipeTitle: "にんじんの爽やかサラダ",
RecipeDetails: "にんじんをオリーブオイルで和えたサラダです。すっぱさも病みつきになります"
}
)

App > 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
)
)
)

※ ご自身のコレクションを利用する場合は、「colRecipe」(コレクション名)と「RecipeTitle」(検索する列名)を置き換えてご利用ください
解説
ざっくりとした流れは下記の通りです。
- 内側の「Split~ 」部分で、入力されたテキストをスペース(半角&全角)で分割し、検索キーワードを取得
- 外側の「Filter~」部分で、検索キーワードのいずれかが含まれている行をピックアップする
具体的には、検索キーワードが1つも含まれていない行は取得されず、1つでも含まれている行は取得されるという動きになります。
今回の例であれば上2行が取得されます。


AND検索
続いてAND検索です。
式を見ても理解は難しいかと思いますので、何度か利用してみることをお勧めします。
結論
「空の垂直ギャラリー」のItemsプロパティに下記の式を入力してください。
Filter(
colRecipe,
CountRows(
Filter(
Split(
Substitute(
txtSearch.Text,
" ",
" "
),
" "
),
Value in RecipeTitle
)
) = CountRows(
Split(
txtSearch.Text,
" "
)
)
)

※ ご自身のコレクションを利用する場合は、「colRecipe」(コレクション名)と「RecipeTitle」(検索する列名)を置き換えてご利用ください
解説
ざっくりとした流れは下記の通りです。
- 内側の「Split~ 」部分で、入力されたテキストをスペース(半角&全角)で分割して検索キーワードを複数取得
- 外側の「Filter~」部分で、すべての検索キーワードが含まれている行をピックアップする
具体的には、「入力された検索キーワードの数」と「RecipeTitleに含まれている検索キーワードの数」を比較して、同数の場合のみ取得されるという動きになります。
これによって、すべての検索キーワードが含まれている行のみを取得するという動きを実現できます。
今回の例であれば上1行のみが取得されます。


まとめ
コレクションを複数キーワード(半角&全角スペース区切り)で絞り込む方法をお伝えしました。
Filter関数とIsEmpty関数/CountRows関数を組み合わせることで、AND検索やOR検索を実現することができます。
式を見てすぐに理解するのは難しいと思いますので、手元で動かしながら確認いただければと思います。


