Power Automateのアレイのフィルター処理(Filter Array)。配列を条件で絞り込む方法と式の書き方

Power Automateのアレイのフィルター処理(Filter Array)は、配列の中から条件に合う行だけを抽出するアクションです。Apply to eachでif分岐を書かなくても、配列を一括で絞り込めます。

アレイのフィルター処理(Filter Array)とは

行を条件で絞り込む

SharePointリストから取得した100件のアイテムの中から、ステータスが未完了のものだけを取り出したい。そういうケースで活躍するのがアレイのフィルター処理(Filter Array)です。SQLのWHERE句に近い感覚で使えます。

アレイのフィルター処理(Filter Array)は配列を入力として受け取り、指定した条件に一致する要素だけを含む新しい配列を返します。元の配列の件数が何件あっても、条件に一致しない行はすべて除外されます。Power Automateのデータ加工アクション全体の位置づけはPower Automate入門の全体マップで整理しています。

選択(Select)との使い分け

似た名前の選択(Select)アクションと混同しやすいですが、目的が違います。

アクション何を変える出力
アレイのフィルター処理(Filter Array)行(レコード)条件を満たす行のみ
選択(Select)列(プロパティ)全行、列を変換

アレイのフィルター処理(Filter Array)で行を絞ってから、Selectで列を整形するという流れが現場でよく使うパターンです。

アレイのフィルター処理(Filter Array)の基本設定

アクションの設定項目

アレイのフィルター処理(Filter Array)の設定画面は2つの要素で構成されます。

差出人(From):フィルタリングしたい配列を指定します。SharePointのアイテムを取得のbody/valueや、別のアクションの出力配列を渡します。

条件(Where):絞り込みに使う条件を定義します。詳細編集モードとテキストモードの2種類があります。詳細編集モードは左辺・演算子・右辺をドロップダウンで選ぶGUI操作、テキストモードは式を直接書きます。

詳細編集モードで条件を設定する

詳細編集モードでは、左辺に絞り込みに使うプロパティ(動的なコンテンツから選択)、演算子にis equal toなどを選び、右辺に比較する値を入力します。

例えばステータス列が未完了の行を絞り込む場合はこのように設定します。

左辺: item()?['Status']
演算子: is equal to
右辺: 未完了

詳細編集モードは直感的ですが、複数条件を組み合わせるときに制約があります。ANDとORを混在させたい場合はテキストモードのほうが柔軟です。

テキストモードで条件を書く

テキストモードに切り替えると、条件を式として直接書けます。複数条件の組み合わせが自由になります。

// ステータスが未完了の行を取得
@equals(item()?['Status'], '未完了')

// ステータスが未完了かつ担当者が自分の行
@and(
  equals(item()?['Status'], '未完了'),
  equals(item()?['AssignedTo']?['DisplayName'], '守屋祐輔')
)

// ステータスが未完了または期日が今日より前の行
@or(
  equals(item()?['Status'], '未完了'),
  less(item()?['DueDate'], utcNow())
)

テキストモードの式は先頭に@をつけた書き方で評価されます。慣れると詳細編集モードより素早く設定できます。

よく使う絞り込みパターン

文字列の一致で絞り込む

最もよく使うのは文字列の完全一致です。

// カテゴリが営業の行
@equals(item()?['Category'], '営業')

// 特定の人が担当する行
@equals(item()?['AssignedTo']?['DisplayName'], '田中太郎')

日付の比較で絞り込む

期日が今日より前の未対応タスクを抽出するようなケースでは、日付の比較を使います。

// 期日が現在時刻より前の行(期限超過)
@less(item()?['DueDate'], utcNow())

// 期日が今日から7日以内の行
@and(
  greaterOrEquals(item()?['DueDate'], utcNow()),
  less(item()?['DueDate'], addDays(utcNow(), 7))
)

utcNow()はUTC時刻を返すため、日本時間と9時間ずれます。日付比較をする場合は、SharePoint側の日時列がUTCで保存されていることを踏まえた上で設計してください。私が現場で期日アラートを作ったとき、時差を考慮せずに比較してしまい、1日ズレた通知が飛んでしまいました。

数値の比較で絞り込む

// 金額が10万円以上の行
@greaterOrEquals(item()?['Amount'], 100000)

// 優先度が3以上の行
@greaterOrEquals(item()?['Priority'], 3)

アレイのフィルター処理(Filter Array)の結果が空のときの処理

空配列チェックを入れておく

アレイのフィルター処理(Filter Array)の結果が0件になることがあります。その後のアクションで配列の先頭要素を参照するような処理があると、0件のときにエラーになります。

条件分岐アクションを入れて、アレイのフィルター処理(Filter Array)の結果が空かどうかを確認してから後続の処理に進む設計が安全です。

// アレイのフィルター処理(Filter Array)の結果が空かチェックする条件式
empty(body('Filter_array'))

empty()がtrueのときは処理をスキップする分岐を作り、falseのときだけ後続の通知や更新に進むようにします。本番で動かしているフローほど、0件パターンのケアを忘れないようにしてください。

length()で件数を確認する

絞り込んだ結果の件数を取得したいときはlength()を使います。件数を変数に入れておくと、Teams通知のメッセージに差し込めます。

// アレイのフィルター処理(Filter Array)の結果件数
length(body('Filter_array'))

たとえば今日期日のタスクが何件あるかを通知する場合、length()の結果をメッセージに組み込むと実用的な通知になります。

Apply to eachとの使い分け

アレイのフィルター処理(Filter Array)を使えば、Apply to eachの中でif条件を書いてスキップする処理が不要になります。Apply to eachはループのたびにアクションを実行するため、件数が多いと実行時間がかかります。アレイのフィルター処理(Filter Array)で先に絞り込んでからApply to eachに渡せば、処理するループ回数を減らせます。

Apply to eachの中でif分岐を書いて実質的にフィルタリングしている部分があれば、アレイのフィルター処理(Filter Array)に置き換えることを検討してみましょう。Apply to eachとその最適化についてはApply to eachの解説で詳しくまとめています。

まとめ

アレイのフィルター処理(Filter Array)は、配列の行を条件で絞り込むシンプルなアクションです。難しいのは最初の式の書き方だけで、一度覚えれば同じパターンを使いまわせます。

まずは単一条件の完全一致から試してみましょう。慣れてきたらandやorを組み合わせた複数条件に挑戦してみてください。アレイのフィルター処理(Filter Array)で絞った配列をSelectで整形する流れが身につくと、Power Automateのデータ処理がぐっと楽になります。

Xでフォローしよう