
今回はFilter関数の使い方を見ていきます。
Filter関数はエクセルでも装備されていますが、まだまだなじみの少ない関数のためFilter関数は使いどころがむずかしいかもしれません。
ここでしっかりと使い方を学んでいきましょう。

PowerAppsに必須の知識PowerFX対応の学習本はこちら
PowerApps学習の本命・実際のアプリももらえる学習本
PowerApps学習方法一覧

概要
Filter関数はコレクションやエクセルのテーブルなどで作ったデータベースを特定の条件でフィルターすることで目的のデータベースを得る関数になります。
エクセルでもフィルター機能で表の中から条件に合致するものを表示させることがあると思いますが、それと似た機能となります。
入力内容の仕方と引数
Filter関数は引数が必要な関数となります。関数の構造は
Filter(テーブル名,条件式1[,条件式2,条件式3…])
となります。
条件式1までは必須ですが、条件を複数指定する場合は「,」で区切って指定していきます。
テーブル名
テーブル名にはデータベースの名前を入力します。
コレクションの場合はコレクション名が入ります。 SharePointを使用している場合はリスト名、エクセルのテーブルを使っている場合はテーブル名を入力しましょう。
※SharePointのリストやexcelのテーブルはコネクションしておかないとPowerAppsで使えないので、あらかじめつないでおきましょう。


条件式
条件式は結果がTrueかFalseになる比較演算子などを利用した式を入力します。
Filter関数の場合は、レコード(データベースの横一行分のデータ)内のデータが条件に合致しているかどうかで判定されます。 レコード内のデータを指定する方法はカラム(データベースの縦一列分のデータ)のタイトルを入力することになりますので条件式のところには
カラム名=抽出したい条件内容
のような形になります。
条件式は複数設定できますが、複数設定した場合はAndで結ばれる(複数の条件を同時に満たす)ことになります。
Filter(テーブル名,条件式1,条件式2)→Filter(テーブル名,And(条件式1,条件式2))
一つのレコードの中の一つの列内のデータで複数の条件を満たすということは論理上あり得ないので条件を複数設定する使い方は必然的に複数列ですべての条件を満たす場合というような使い方になります。
同一の列(縦軸)に複数の条件を行う場合は一つの条件の中でOr関数を使いましょう。
Filter(テーブル名,条件式①,条件式②) →条件式①,条件式②の両方が満たされる時に表示される
条件式① | 条件式② | 戻り値への反映 | |
レコード1 | 比較結果 True | 比較結果 True | 反映される |
レコード2 | 比較結果 False | 比較結果 True | 反映されない |
レコード3 | 比較結果 True | 比較結果 False | 反映されない |
レコード4 | 比較結果 False | 比較結果 False | 反映されない |
Filter(テーブル名,Or(条件式①,条件式②))
条件式① | 条件式② | 戻り値への反映 | |
レコード1 | 比較結果 True | 比較結果 True | 反映される |
レコード2 | 比較結果 False | 比較結果 True | 反映される |
レコード3 | 比較結果 True | 比較結果 False | 反映される |
レコード4 | 比較結果 False | 比較結果 False | 反映されない |
PowerAppsには委任の問題があり、使える比較演算子が環境によって異なりますので注意してください。
委任とはデータベースに関する操作(検索や集計など)をアプリで行わずにデータソースがわで行う機能になります。アプリ内で処理してしまうとデータベースの内容を一度アプリに全て持ってこないといけなくなり処理がとんでもなく膨大になってしまうため、処理をデータベース側で行い、必要なものだけをアプリ側に持ってくるということになります。この委任のおかげでスムーズに最小限の通信でアプリが使えますが、データベースの環境によって使える関数が決まってきます。
CDSとSharePointにおける条件で使えるものは下記の表の通りになります。
CDS | SharePoint | |
Not | ○ | |
= | ○ | ○ |
<,<=,<>,>,>= | ○ | ○(数値列のみ、ID列は不可) |
AND,OR | ○(Notは使えない) | |
&&,|| | ○ | ○(!は使えない) |
StartsWith | ○ |
簡単にまとめてしまうと
- CDS
- 論理の反対が使える
- 文字の開始を指定できない
- SharePoint
- 論理の反対が使えない
- 文字の開始を指定できる
ということになります。ANDと&&、ORと||は優先順位の問題を解決してくれますが、PowerAppsではあまり関係ないかなとも思いますので気にしないで大丈夫です。
ところで、条件式の設定の時に、列名だけ書いても反応しますが、PoweAppsに詳しくなると列名の部分は、「レコード名.列名」ではないかと疑問に思うかもしれません。
Filter関数の条件で列名だけで反応してくれるのはレコード名が省略されているからであって正式には
ThisRecord.列名
と書きます。
戻り値
Filter関数の戻り値はテーブルとなります。そのため、ClearCollect関数や変数、データベースを表示するオブジェクトなんかで受けてあげる必要性があります。
コレクションにする場合:ClearCollect(コレクション名, Filter (編集元テーブル名,条件式))
変数にする場合:UpdateContext({変数名:} Filter (編集元テーブル名,条件式))
使いどころ
Filter関数はエクセルのフィルター機能のように使えますので、元のデータベースの中身を変更せずにデータを抽出させる場合には有効な方法となります。
また、データベースが縦持ちの時にも非常に有効な方法となります。縦持ちの場合には抽出した内容を必要な列だけ表示し配列にすることで条件に従ってドロップボックスの内容を制御するといった使い方ができます。
- 元のデータベースの中身を変更せずにデータを抽出させる
- 縦持ちのデータベースから抽出した内容でドロップボックスの選択項目とする
具体例
ということで実例を見ていきましょう。
具体例①
コレクションからレコードを抽出し、Filter関数の戻り値をデータベースオブジェクトに表示させます。
元となるデータベース
抽出するデータベースとして下記の内容のコレクション(コレクション名:従業員リスト)を作成します。
名前 | 部署名 | 年齢 | 性別 |
一郎 | 営業 | 20 | 男 |
次郎 | 営業 | 25 | 男 |
三郎 | 営業 | 30 | 女 |
四郎 | 総務 | 30 | 男 |
五郎 | 経理 | 35 | 男 |
ClearCollect(従業員リスト,
{名前:"一郎",部署名:"営業",年齢:20},
{名前:"次郎",部署名:"営業",年齢:25},
{名前:"三郎",部署名:"営業",年齢:30},
{名前:"四郎",部署名:"総務",年齢:30},
{名前:"五郎",部署名:"経理",年齢:35})
✔︎単純に抽出する
まず初めに営業の人たちだけを抽出し、一致した内容(部署名が営業の人達のレコード)
をデータベースエリアに反映させます。
ClearCollect(従業員リスト_Filter,Filter(従業員リスト,部署名="営業"))

✔︎複数条件で抽出する(同一列内)
次に複数条件として、営業の中で20代の人(=年齢が30未満の人)を抽出します。
部署名については前回と同様に営業で固定し、年齢のほうは30より下で固定とすると下記の構文になります。
ClearCollect(従業員リスト_Filter,Filter(従業員リスト,部署名="営業",年齢<30))

✔︎複数条件で抽出する(複数列)
最後にOrの複数条件として同一列内の営業と総務の人を抽出してみます。
部署名の列に営業もしくは、経理が入っていればよいので構文は次の通りになります。
ClearCollect(従業員リスト_Filter,Filter(従業員リスト,Or(部署名="営業", 部署名="経理")))
実際にはフィルターする条件はテキストボックスの入力内容やドロップボックスの入力内容であることも多いので、条件のところにオブジェクト名.プロパティを入力しておくことで、ユーザーが任意でフィルターすることができます。

具体例②
では次に縦持ちのデータベースの場合を見てみます。
例えばユーザーが部署名を選んでその中から特定の個人を選びたい場合を想定してみます。
元となるデータベース
抽出するデータベースとして下記の内容のコレクション(コレクション名:従業員リスト)を作成します。
部署名 | 名前 |
営業 | 一郎 |
営業 | 次郎 |
営業 | 三郎 |
総務 | 四郎 |
経理 | 五郎 |
ClearCollect(従業員リスト,
{部署名:"営業",名前:"一郎"},
{部署名:"営業",名前:"次郎"},
{部署名:"営業",名前:"三郎"},
{部署名:"総務",名前:"四郎"},
{部署名:"経理",名前:"五郎"})
今回はちょっと応用してドロップボックスから部署名を選びその中からドロップボックスで名前を選ぶというやり方にしてみます。
手順は次の通りになります。
- 一つ目のドロップボックス(DropDown1)に部署名の項目を選ばせる方法
- 二つ目のドロップボックス(DropDown2)に一つ目のドロップボックスで選んだ部署名の人たちだけを選ばせる
となります。
ドロップボックスのItemsには配列状態のテーブル(縦1列のテーブル)が必要になります。特定の列だけを抽出する場合は テーブル名(.列名) で表示項目を指定できますので今回はItemsのプロパティに
従業員リスト.部署名
とします。
しかしながらこれでは、営業が三つ出てきてしまうので配列の中から重複を削除してくれる関数Distinct関数を間にかませることで重複を削除できますのでドロップボックスのItems属性には以下の構文を入力します。
Distinct(従業員リスト.部署名,ThisRecord.部署名)

このドロップボックスで選択されている内容はSelectedで取得できますのでFilter関数でこのドロップボックスで選択された内容で抽出する場合には
Filter(従業員リスト,部署名 = Dropdown1.SelectedText.Value)
となります。これで一つ目のドロップボックスで選ばれた部署名の人たちだけが選択できます。
