Power Automate の配列操作|フィルター配列で絞って、選択で整えて、結合でまとめる

Power Automate 実践・Tips

📝 この記事は、Power Automate で配列を扱う2つのアクションを、実際に動かしながら整理したものです。
式や関数の仕様はMicrosoft 公式(ワークフロー式の関数リファレンス)で確認しています。

🧭 なぜこの記事を書いたのか
一覧を取ってきたあと、そのまま全件まわしている フローを社内でよく見かけます。
必要なのは数件なのに、毎回全部を処理している。
先に絞るという一手を入れるだけで、速さも安定性も変わります。

全件取ってきたけれど、使うのは条件に合う数件だけ。
取り出した値を、メール本文に1行で並べたい。
この記事では、フィルター配列で絞る・結合で1本にまとめるの2つを扱います。

配列は棚だと思うことにしています。
棚から必要な引き出しだけ抜き出すのがフィルター配列、抜き出した中身を1本の紐でつなぐのが結合。この置き換えで、自分の中では整理がつきました。

📋 この記事で分かること

  • 条件に合う要素だけを残すフィルター配列の使い方
  • 配列を1本の文字列にする結合(Join)の使い方
  • 絞ってからまわすと何が良くなるのか
  • つまずきやすい「型」と「0件」の扱い

フィルター配列:先に絞る

「条件に合うものだけ残す」を、式を書かずに設定できるアクションです。

設定するのは2つだけです。差出人(From)に絞りたい配列を入れ、
その下の条件欄に左・比較方法・右を書きます。条件アクションと同じ構造です。

出力は常に配列です。1件だけ使いたい場合でも配列で返るので、
first() で取り出します。

first(body('フィルター配列'))?['タイトル']

💡 絞ってからまわすと3つ得をする
速い|まわす件数が減ります。
止まりにくい|対象外のデータでエラーになる可能性が消えます。
読みやすい|ループの中に条件を書かなくて済むので、処理が1本道になります。

条件が通らないときは、まず型を見ます。
文字列と数値を比べようとすると一致しません。
数値は int()、文字は string() でそろえてから比べます。
日付は formatDateTime() で書式をそろえます。

結合(Join):1本の文字列にする

結合に渡せるのは「値だけの配列」[ { “名前”:”田中”, “金額”:1000 }, … ]オブジェクトが並んだ配列結合(Join)読めない結果選択(Select)を挟んで、値だけにする[ “田中”, “鈴木”, “佐藤” ]値だけが並んだ配列結合(Join)田中、鈴木、佐藤
一覧の取得が返すのはオブジェクトの配列。そのままでは結合に渡せない

配列をメール本文に並べたいときに使います。区切り文字を指定するだけです。

['A', 'B', 'C'] + 区切り「, 」 → A, B, C

式でも書けます。

join(body('フィルター配列'), '、')

渡せるのは「値が並んだ配列」だけです。
一覧の取得で返ってくるのは、たいていオブジェクトが並んだ配列です。
そのまま結合には渡せません。
先に「選択(Select)」で欲しい列だけ抜き出して、値の配列にしてから渡します

数値が混ざっている場合も、そのままでは扱えません。
string() で文字にそろえてから渡します。

選択(Select)を挟む

絞る → 形を変える → つなぐ① 一覧を取得全部で8件② フィルター配列条件に合う3件③ 選択(Select)値だけの配列田中鈴木佐藤④ 結合(Join)1本の文字列田中、鈴木、佐藤
この並びを覚えると、Apply to each を書く回数が目に見えて減る

「選択」は、配列の形を組み替えるアクションです。
オブジェクトの配列から、欲しいキーだけを取り出して並べ直せます。

たとえば申請一覧から名前だけを抜き出せば、
そのまま結合に渡して「田中、鈴木、佐藤」という1行が作れます。

絞る(フィルター)→ 形を変える(選択)→ つなぐ(結合)
この3段が、配列を扱うときの基本の並びです。

この3つを使うようになってから、Apply to each を書く回数が減りました。
ループの中で条件を見て、変数に足して……とやっていた処理が、アクション3つで済むようになります。

0件のときを必ず考える

絞った結果が0件になることは普通に起きます。そのまま first() を使うと止まります。

件数で分岐しておくのが確実です。

length(body('フィルター配列')) → 0 なら通知しない、など

結合は0件でも空文字を返すので止まりませんが、
空のメールが飛ぶことになります。送る前に件数を見ておくと安心です。

選択(Select)で形を組み替える

フィルターで絞ったら、次は形を整える段です。ここで使うのが「選択」です。

設定画面は「キー」と「値」の対応表になっています。
左に新しい項目名、右に元の配列から取る値を入れます。

たとえば申請一覧から「名前」と「金額」だけを抜き出せば、
不要な列を落とした、扱いやすい配列になります。

💡 キーを消すと「値だけの配列」になる
選択の画面には、テキストだけを出力するモードがあります。
キーを消して値だけにすると、
['田中', '鈴木', '佐藤'] のような単純な配列が作れます。
これが、そのまま結合に渡せる形です。

集合として扱う関数

配列同士を組み合わせる関数もあります。名簿の突き合わせなどで役立ちます。

重複を除いて合わせる|2つの配列を1つにまとめ、重複を落とします。

union(配列A, 配列B)

両方にあるものだけ|共通している要素だけを残します。

intersection(配列A, 配列B)

先頭を飛ばす・先頭から取る|件数を区切りたいときに使います。

skip(配列, 3) / take(配列, 5)

union()同じ配列を2回渡すと重複除去として使えます。
ダブりを消したいだけのときに便利です。

並び替えの関数はありません。
配列を任意の順に並べ替える関数は用意されていません。
順序が必要なら、取得する側で並べておくのが基本です。
一覧を取るアクションに並び替えの指定があるなら、そこで指定してしまいます。

Apply to each を速くする

どうしてもループが必要なときは、動かし方を調整できます。

Apply to each の設定に同時実行の指定があります。
既定では順番に処理しますが、有効にすると複数を並行して進められます。

ただし順序は保証されなくなります。
番号を振る、前の結果を次で使う、といった順番に意味がある処理では使えません
また、同時に実行すると
接続先のサービス側で制限に当たりやすくなります
速くしたいだけなら、まずまわす件数を減らすほうが確実です。

件数が多いときの取得

一覧を取得するアクションには、既定で返す件数の上限があります。
「全部取ったつもりが途中までだった」という事故は、ここで起きます。

アクションの設定にページ分割の項目があるので、
件数が多いと分かっているなら有効にして、しきい値を指定します。

そもそも全件を取らずに済むなら、そのほうが速くて安全です。
取得する時点で絞れるなら、フィルターより手前で絞る
一覧アクション側のクエリで条件を書ければ、配列を扱う手間ごと減らせます。

実際に組んでみる:期限切れをまとめて1通で知らせる

ここまでの話を、1本のフローにつなげます。
「毎朝、期限を過ぎている申請を集めて、担当者に1通だけ送る」という形です。

1一覧を取得する

まず対象のリストを取得します。件数が多いことが分かっているなら、
ページ分割を有効にしておきます。

2フィルター配列で絞る

期限が今日より前で、かつ状態が未完了のものだけ残します。
日付を比べる前に、書式をそろえるのを忘れないでください。

30件なら終わる

件数を見て分岐します。0件のときに空のメールを送らないためです。

length(body('フィルター配列')) が 0 より大きい

4選択で1行の形にする

タイトルと期限をつなげて、読める1行にします。
キーを消してテキストだけのモードにすれば、値だけの配列になります。

item()?['タイトル'] + '(期限:' + item()?['期限'] + ')'

5結合して1通で送る

改行で結合すれば、そのまま箇条書きになります。
1件ずつ送らないので、通知は1通で済みます。

この形にする前は、Apply to each の中でメールを送っていました。
10件あれば10通飛びます。受け取る側からすると、たまったものではありません。絞る・整える・つなぐを知ってから、通知の作り方そのものが変わりました。

📌 ループを疑う癖をつける

ループの中で送るか、まとめて1通にするかApply to each の中で送る10件 → 10回まわすメール 10通絞る → 整える → つなぐ1件にまとめてから送るメール 1通
10件あれば10通飛ぶ。受け取る側から見ると、これはかなり負担になる

Apply to each が出てきたら、いったん止まって考える価値があります。

  • 全件まわす必要が本当にあるか|フィルター配列で先に絞れないか
  • 1件だけでいいのではないかfirst() で済むかもしれません
  • 中で送っていないか|通知やファイル作成は、ループの外に出せることが多いです

ループが消えると、フローは短くなり、速くなり、読めるようになります
3つとも一度に良くなるので、まず疑う価値があります。

補足:確認ポイント

item() と items() の違い
選択やフィルターの中では item() で、いま処理している1件を指します。
一方、Apply to each の中で明示的に指したいときは
items('ループの名前') の形を使います。
ループが入れ子になっているとき、
どちらのループの1件なのかを指定できるのが後者です。

?[‘キー’] を使う理由
値を取り出すときに ? を付けておくと、
そのキーが存在しない場合にエラーではなく null が返ります
データにばらつきがある一覧を扱うときは、付けておくほうが止まりにくくなります。

配列の中の配列
入れ子になった配列は、そのまま扱おうとすると混乱します。
選択で1段階ずつ平らにしていくのが結局いちばん早いです。
一気に取り出そうとして長い式を書くと、あとで直せなくなります。

結合した結果が「,」だらけになる
オブジェクトの配列をそのまま結合に渡すと、
中身がまとめて文字にされて読めない結果になります。
選択を挟んで値だけの配列にしてから渡す、が原則です。

覚える順番

配列まわりは一度に覚えようとすると多く見えます。実際に効く順に並べるとこうなります。

  • 1番目:フィルター配列|これだけで、ループの件数が減ります
  • 2番目:選択|形を変えられると、扱える場面が一気に増えます
  • 3番目:結合|通知やメールの見た目が整います
  • 4番目:集合の関数|必要になったときに調べれば十分です

最初の2つを覚えるだけで、フローの見た目はかなり変わります

配列は、最初に見たとき「自分には関係なさそう」に見えるところだと思います。
ただ、一覧を扱うフローには必ず出てきます。私はここを後回しにしていたあいだ、ずっと Apply to each の中で組んでいました。

逆に言えば、ここを越えると作れるものの幅がはっきり広がります。
一覧から必要なものだけ取り出して、読める形にして、1通にまとめる。
この流れが作れるかどうかが、実務で使えるフローになるかの分かれ目です。

まとめ

📌 この記事のポイント

  • フィルター配列で先に絞る。速く・止まりにくく・読みやすくなる
  • 出力は常に配列。1件だけ使うなら first()
  • 結合に渡せるのは値の配列だけ。オブジェクトの配列は選択を挟む
  • 並びは絞る → 形を変える → つなぐ
  • 0件のときの分岐を必ず用意する

📚 仕様の出典

join()first()length() の仕様は、ワークフロー式の関数リファレンス(Microsoft Learn)に記載されている内容です。

PA45 は毎週やっています

テーマを1つに絞った45分のオンライン講座です。プログラミング未経験でも、手を動かしながら1つずつ覚えられます。

次回のPA45を見る

※ 本記事は公開日時点の内容です。筆者が実際に試した手順をまとめたもので、Power Automate の仕様は今後変わる可能性があります。
※ 記事の構成・図解の一部は、AIを壁打ち相手にしながら作成しています。

\ 最新情報をチェック /

💌

最新のPower Automate Tipsを毎日チェック

1枚スライドで関数・概念をわかりやすく解説しています。

𝅧 @isamu_Automate をフォロー →

PA45 — 45分でPower Automateを一緒に学ぼう

毎週木曜夜・オンライン・無料のハンズオン講座。初心者歓迎。

次回PA45に参加する →

コメント

PAGE TOP