Power AppsでSharePoint Listのデータをフィルタして表示する方法
本記事でわかること
Filter関数の基本
Filter(データソース, 条件式[, 条件式2, ...]) は、条件に合う行だけを返す関数です。
条件は
=(等しい)、>=(以上)などの比較や、&&(AND)、||(OR)で組み合わせます。
基本構文
Filter(
データソース,
条件
)
Filter関数の使用例
例1: 単一の条件
データソースの後に、欲しい行の条件を指定
Filter(
商品テーブル,
商品名 = "ノートPC" // 「商品名」が「ノートPC」の行だけ
)
例2: 複数の条件(AND)
条件を「&&」でつなぐ(いくつ繋いでもOK)
Filter(
商品テーブル,
商品名 = "ノートPC" && 価格 < 100000 // 「商品名」が「ノートPC」かつ「価格」が10万円未満の行だけ
)
または、条件を「,」でつなぐ(いくつ繋いでもOK)
Filter(
商品テーブル,
商品名 = "ノートPC", 価格 < 100000 // 「商品名」が「ノートPC」かつ「価格」が10万円未満の行だけ
)
例3: 複数の条件(OR)
条件を「||」でつなぐ(いくつ繋いでもOK)
Filter(
商品テーブル,
商品名 = "ノートPC" || 価格 < 100000 // 「商品名」が「ノートPC」または「価格」が10万円未満の行だけ
)
すると、自由にフィルタリングしたデータの表示ができます!
条件が選ばれてたらその条件、選ばれていなかったらすべて出す方法
重要な構文
ユーザーが何も入力していない/何も選んでいないとき(例えば画面を開いた瞬間)は全件表示したい場合
以下のように条件を「IsBlank(...)||条件」の形式にします。
Filter(
データソース,
// 入力欄を空チェックして、空だったら何もフィルターをかけない、何か入ってたらその件で絞り込む
IsBlank(入力欄や選択肢などのコントロール) || 条件
)
使用例
例えば、ユーザーが検索テキスト入力(ここではTextInput1)に何も記入していないときは全件表示、何か記入したらその条件で絞り込みたい場合
Filter(
商品テーブル,
// 入力が空なら何もフィルターをかけず全件、入力があれば商品名で絞り込み
IsBlank(TextInput1.Text) || 商品名 = TextInput1.Text
)
上式の意味:
- IsBlank(TextInput1.Text) … TextInput1への入力がないなら
true(= 全行が通過) - ||の左が
trueなら||の右は評価されず通過(=右の条件を無視)。つまり、左がtrueになるような条件を設定すれば、右が適応されたり無視されたりできる。 - 商品名 = TextInput1.Text … 入力があるときだけ一致レコードに絞り込み
複数条件への拡張
ドロップダウンや日付など、複数の入力が空欄でも動くようにするには、同じパターンを積み重ねます。
とにかく「IsBlank() ||
条件」を「,」区切りで繰り返す!
Filter(
商品テーブル,
IsBlank(TextInput1.Text) || StartsWith(商品名, TextInput1.Text), //TextInput1に何か入力されてたら商品名で前方一致検索
IsBlank(CategoryDropdown.Selected.Value) || カテゴリ.Value = CategoryDropdown.Selected.Value, //CategoryDropdownで何か選ばれてたらカテゴリで絞り込み
IsBlank(DatePicker1.SelectedDate) || 販売日 >= DatePicker1.SelectedDate //DatePicker1で日付が選ばれてたらその日以降で絞り込み
)
- ANDの積み上げ:
Filterの第2引数以降の「,」は AND 結合と同義。行ごとにすべて満たす必要があります。 - あとは各「,」区切りの塊ごとに「IsBlank() || 条件」を記載するだけ
- むやみに複数のIF文で条件分けする方法はメンテナンスが非常に大変なのでなるべく使わない!
IsBlank() || 条件この形を覚えましょう!
委任に関して
フィルター条件を設定する際、重要になるのが委任という考え方です。
委任というのはザックリ「データソースが2000件(初期値は500件)を超える場合、条件に当てはまるデータ全部取ってこれないかも」というPower
Appsに課せられた制限です。
特に理由がなければ、委任行の設定を最大値である2000件に変更しておきましょう。
委任行の最大値の設定方法
これで、データソースが2000件以内のときは、条件に合致するデータをすべて取得できます。
無理やり委任を回避する方法
少しややこしいですが、下記のような式でデータを取得しておけば、2000件を超えるデータも活用できます。
(データソースを直接見るのではなく、コレクションに一旦格納して使う形になります)
準備①:「IDcopy」という、ID列をコピーした数値列をデータ側に用意(ID列は大小比較が委任不可能なため)
準備②:以下の式を、AppのOnStartプロパティか、ScreenのOnVisibleプロパティに設定
// 大きな商品テーブル(今回はSharePoint の「ProductList」)を最新化
Refresh(ProductList);
// 1回に扱える件数の上限をしきい値として定義
UpdateContext({ threshold: 2000 });
// リストの一番最後の商品(IDが最大のもの)を取得
UpdateContext({
lastRecord: First(
Sort(ProductList, ID, SortOrder.Descending)
)
});
// ループの最大回数を計算(2000件ごとに分割するため)
UpdateContext({
maxIteration: RoundUp(lastRecord.ID / threshold, 0)
});
// コレクションを初期化(分割して集めた商品データをここに格納)
Clear(colProductList);
// 2000件ごとに商品データを小分けして収集
ForAll(
Sequence(maxIteration, 0), // ループ回数を生成(0,1,2,...)
With(
{
prev: Value(Value) * threshold, // 前回のしきい値
next: (Value(Value) + 1) * threshold // 次のしきい値
},
// 条件に合う範囲の商品をまとめて収集
Collect(
colProductList,
Filter(ProductList, prev < IDcopy && IDcopy <= next)
)
)
);
データを2000件ごとに区切って取得し、colProductListというコレクションに格納するイメージです。慣れてきたら使ってみてください。
FILTER条件チートシート
FILTER関数でよく使用する条件式の記載方法をまとめました。ここでは、委任不可能な条件には注意書きを入れています。
この表を参考に、様々な条件を試してみてください!
| 条件 | 記載例 | 備考 |
|---|---|---|
| =(等しい) |
|
完全一致で検索 Tips: ID列では=しか委任できない(2000件以上の場合注意) |
| <>(等しくない) |
|
「≠」の意味。指定値以外を抽出 Tips: 文字列の場合委任不可能(2000件以上の場合注意) |
| in(含む) |
|
部分一致検索。テキスト検索でよく使う Tips: 委任不可能(2000件以上の場合注意) |
| StartsWith |
|
前方一致(指定文字で始まるか) |
| EndsWith |
|
後方一致(指定文字で終わるか) |
| >, <, >=, <= |
|
数値や日付の比較に使用可能 |
| Or / And |
|
複数条件を組み合わせ Tips: &&や||を使う
|
| IsBlank |
|
空白チェックに利用 Tips: うまくいかないときは IsEmpty()を使ってみてもよい委任不可能(2000件以上の場合注意) |
| Not |
|
条件の否定(条件をひっくり返す) 「!」でも代用可: !Not(IsBlank(承認者))Tips: 委任不可能(2000件以上の場合注意) |
列型ごとのチートシート
FILTER関数で条件を指定する際、フィルターしたい列の型ごとに書き方が異なります。ここでは、その型ごとの記載方法をまとめました。
特に「選択肢列」「ユーザー列」は独特で、皆さん詰まりやすいので注意しましょう。
| 列の種類 | 条件の記載例 | 備考 |
|---|---|---|
| テキスト列 |
|
文字列は「"」で囲む Tips: 「in」は委任不可能 |
| 数値列 |
|
数値はクォーテーション不要 Tips: 「型が違う」エラー時は Value(価格)やText(価格)で数値/テキスト型変換ID列は「=」以外は委任不可能。ID列でなければ>や <=など委任可能 |
| 選択肢列(単一選択) |
|
選択肢列は「.Value」を指定 |
| 選択肢列(複数選択) |
|
複数選択肢列は「Concat」で結合して部分一致検索この例だと、「製品カテゴリ」列の複数選択の中に「オフィス用品」が選ばれている行を抽出 |
| 日付列 |
|
日付列には時刻を含む/含まないの設定がデータソース側であるので注意。 時刻を含むかどうかもちゃんと揃えて条件を作成しましょう。 Tips: Today()は日付のみ、Now()は時刻も含む
|
| ユーザー列 |
|
ユーザー列はとりあえず列名の後に「.」を打ってみて、予測変換から使えそうなものを選んでみるでもOKTips: DisplayNameとEmailだけ委任可能。それ以外は委任不可能。 |
短時間のスポット相談から、要件整理&設計レビューまで対応します。