ループ内配列、複数配列の一括結合のスマートな方法!

はじめに

TIPSこの記事は、Microsoft Power Automate – Qiita Advent Calendar 2025 シリーズ2 12月20日 担当分の記事です。

前回の記事で動的なDataverseからの複数テーブルからの項目取得、CSV出力のサンプルをご紹介しました。
その中でループ内で変数に配列を詰めてUNIONして結合する方法で実装しておりました。

今回はその部分はループ内で配列取得→いったん結合、ループ外で結合を解いてひとつの配列にする方法をご紹介します。変数を使わずに配列のループを外側で一括配列かすると2重配列となってしまい使い勝手が悪いです。
この方法であればループ内で配列を取った複数の配列をひとつの配列に結合することができます!

シンプルな変数を使った配列変数の追加の例

こちらの実装は前回の記事でご紹介している部分ですのでそちらをご参考ください。
ループ内で変数に毎回詰めて結合しているイメージです(変数値を一時退避してUNIONで取得済みデータと結合)

サンプルの全体図:ループ内で変数に設定をしている部分

今回の方法の全体図:ループ外でJOINして保持、ループ外で選択アクションで結合!

以下サンプルの全体図です。ポイント部分のみ解説していきます。
複数テーブルからデータを取得、選択アクションで統一データを作成するまでは同一なので割愛します。前回記事ご確認ください。

ループ内で取得した配列データを特殊文字でJOINする!

作成アクションでjoin関数でやっても同じですが、結合アクションを使ったサンプルです。
対象の配列データを指定した特殊文字で結合します。ここはデータで確実に使われていない文字列にします。
今回は★★★としていますが、$’&%%$$など、まず使われない文字列であればよいと思います。

Code元: @{body(‘選択’)}
結合する値: ★★★

この段階で実行すると以下のように配列のレコードごとの区切りが★★★でつながった文字列型となります。
これがループ数分出来上がることになります。

ループ外で選択アクションを使ってさらにJoin、Splitして一つの配列に!

次にループの外に選択アクションを追加します。選択アクションのFROM(元)に指定している部分がミソです。

ループ外でループ内のアクションを指定した場合、その内容の配列系で取れています。
そのため、さらにその配列をJOINで特殊文字(★★★)で結合して、それをSplitで同じ文字で分解して配列化します!
※わかりずらいですよねw
マップの部分はJSONになるようにそのItem()をJSON関数で囲みます

Code元:
@{split(join(body(‘結合_配列をいったん特殊文字でJOINで結合’),’★★★’),’★★★’)}
マップ:
@{json(item())}

TIPS重複したデータが取れる可能性があり除外したい場合はUNIONでそれぞれを指定してあげれば重複データを除外してくれます。その場合は以下のように指定すればいいでしょう。
@{union(split(join(body(‘結合_配列をいったん特殊文字でJOINで結合’),’★★★’),’★★★’),split(join(body(‘結合_配列をいったん特殊文字でJOINで結合’),’★★★’),’★★★’))}

実行すると以下のように複数の配列がひとつの配列にガッチャンコされています!やりましたね!

留意点など

このテクニックはループ内で作った作成アクションデータをループ外で作成アクションで指定して配列化する、ピーターズメソッドの応用的な内容です。

そしてループ外でループ内の結果を配列化できるのは1段ループ分のみです。ループがネストされている場合は警告が出て使えません。その点留意です。

活用例など

上記は前回お伝えした動的なテーブルからの複数取得の場合の例ですが、1つのテーブルから数十万行を取ってくるなどの場合、SkipTokenなどを使ってループさせて5000件ずつ取得するケースがあります。
この場合にもそのループ取得の外側でこれをやると変数への設定(UNIONで追加していく)の処理が不要となり高速化できます。※変数設定の処理は基本遅い

また、変数をループ内で使う場合、ループのコンカレンシーで並列処理が使えないケースも多いです(順番が担保されないため警告がでる。バラバラで問題なければ使えるケースもあり)

極力ループ内の変数への追加や設定などは行いたくない場合は、このテクニックでスマートで非常に高速な実装に置き換えれます。

おわりに

動的な指定シリーズを書いていて思い出したので今回はこちらのテクニックをご紹介しました。
普通に配列をピーターズメソッドでやると2重配列になっちゃうので、そこから頑張って文字列加工して調整。。というような方法もあったりはしますが、こちらの方がスマートで安全かと思います。

自分は以前から使っているテクニックではありますが、大規模なシステムでの利用や高速化が求められる場合などでない場合はシンプルな実装でよいと思います。パフォーマンスやコール数低減などが必要なシステムでは有用なテクニックとなります。そういった場合はご参考にしてみてください。それでは!

関連記事

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

ヨウセイ

ヨウセイ

一般職からSharePoint、C#、.NET系技術者へ、そこからPower App、Power Automate技術者へと転身。 ワンランク上のおっさんはPower Appsでシステム開発が出来る〜! qiitaや自社HPでも技術ブログを書いていました。

関連記事

コメント

この記事へのコメントはありません。

CONTENTS