Power Automatede で C# の LINQ の Where Select のようなことをしたい。そう思っていますね? 大丈夫です。私もそう思っています。
■ 要件
例えばこんなデータがあったとします。
[ {"A": "" , "B": "001"}, {"A": "1", "B": "002"}, {"A": "2", "B": "003"} ]
それをこんなデータに変換したい。頻出する要件ですよね。
["001", "003"]
こんなデータに変換するパターンも。
[ {"A2": "1", "B2": "002"}, {"A2": "2", "B2": "003"} ]
C# では LINQ の Where と Select で良く実現するやつです。
■ Power Automate
Power Automate でも非常に分かりにくいですが実現できます。わかりにくいのはアクションの設定 UI なので、わかってしまえば簡単です。
※関数にあってくれるととても扱いやすくていいのですが、今回見つけた手法はアクションです。
Where はデータ操作の アレイのフィルター処理 、Select はデータ操作の 選択 を使います。
この 選択 ですが、内部名は select っぽいですね。設定 UI の 開始 も良くわかりませんが、内部だと from っぽい? select と from と書いてくれるととても簡単だと思うのですが敢えてラベル名を変えているので色々検証してこれがよいということなのでしょう。マップは確かに select よりも適切です。
※コードを確認すると、from と select。わかりやすいです。
■ アレイのフィルター処理 ( Where に相当する機能 )
アレイのフィルター処理 を作っていきます。まずはデータ操作の アレイのフィルター処理 を選択。
こんな感じで設定します。
やっていることは、 作成 でデータを作って
[ {"A": "" , "B": "001"}, {"A": "1", "B": "002"}, {"A": "2", "B": "003"} ]
アレイのフィルター処理 の 差出人 ? に 作成 の 出力 を設定。条件にプロパティ A が空白でないことを設定していし ます。
出力 のコード
@outputs('作成')
条件
length(trim(string(item()?['A']))) |
次の値より大きい |
0 |
関連情報
■ 選択 ( Select に相当する機能 )
続いて 選択 を作っていきます。まずはデータ操作の 選択 を選択。
で、設定 UI はこんな感じです。何をどう設定するか一見難しいですが、このモードを使う必要はないので忘れていいです。右端の マップ をテキストモードに切り替える をクリックすれば OK です。
こんな UI に変わります。シンプル。わかりやすい。
こんな感じに設定します。
やっていることは、 開始 (コードとしては from) に アレイのフィルター処理 の結果を設定して
@{body('アレイのフィルター処理')}
マップ (コードとしては select) に要素ごとのデータのパスを設定しています。要素ごとに、この式の結果が値となります。
item()?['A']
■ 実行
実行するとこんな感じです。
計画通り! 欲しかった値を作ることができました。
■ 選択 の真の力
選択 の真の力はこんなものではありません。C# の LINQ の Select で匿名のオブジェクトへの変換をするのと同じことができます。むしろこちらが本当の力です。
選択 の最初の UI はこの力を発揮するためのものですが、難しいので UI のモードを変えて JSON を書く方が分かりやすいです。
こんな感じです。
{ "A2": "@{item()?['A']}", "B2": "@{item()?['B']}" }
実行結果
計画通り! 要件通りの値が得られました。
■ 簡単ですね
簡単ですね。