aplly to eachは遅すぎるので避けたい
Power Automateで配列にした数値の合計を求めるのは意外と面倒です。ループを回さずJSONの要素同士を合計させる試みです。
ループを回して用意した変数に加算してもよいですが、ご存じのとおりPower Automateのapply to eachは非常に遅いです。そこで、ループを使用せずにJSON→配列→XMLに変換しやすいJSON→XMLを経てxpath関数を使って合計を求めていきます。
xpath関数を使った合計の求め方については、こちらの英文サイトで知ることができました。感謝です。https://www.tachytelic.net/2021/06/power-automate-instant-sum-array/
テストデータとして以下のような都道府県と人口を組み合わせたJSONを用意しました。各都市の人口を合計したいというイメージでステップを進めていきましょう。
{
"prefectures": [
{
"name": "Tokyo",
"population": 1396
},
{
"name": "Osaka",
"population": 882
},
{
"name": "Aichi",
"population": 755
}
]
}
「選択」を使ってJSONを配列に変換する
今度は「選択」を使います。元となるJSONは入れ子構造になっていますが、今回は人口部分だけを合計することが目的です。開始の欄には「prefectures」の中身を取り出すために以下のような式を設定します。
outputs('元データ')?['prefectures']
次に、「選択」のマップ右側にある「T」のようなボタンをクリックして、マップをテキストモードに切り替え、今度は人口だけを取り出すために以下のような式を設定します。
item()?['population']
これでテスト実行してみると、みごとに人口の数字部分だけが配列に変換されていることがわかります。
配列の数値を合計するにはxpath関数を使う
数値を配列として用意することができましたので、次はそれらを合計します。配列の値を合計する関数がPower Automateにはなぜか見つかりません。ぐるぐるとループを回して数値変数に追加していきたくなるところですが、ぐっと我慢してほかの方法を模索していると、xpathという見慣れない関数がありました。解説にはこうあります
指定されたxPath式からxmlノード、ノードセット、または値をJSONとして返します。
さらにDOCSの該当ページを見てみると、「XPath (XML Path Language) 式と一致するノードまたは値を調べて、一致するノードまたは値を返します」とあります。
https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#xpath
なんだか難しいのですが、XMLに変換できるよう、まず以下のようなJSONを作成します。
{
"root": {
"Numbers": [1396,882,755]
}
}
[1396,882,755]の配列部分は前工程で作成した結果をつかうので、画像の「出力」というのは「選択」の出力を使います。
結果はこんな感じのJSONになります。
JSONをXML関数を使って変換
できたJSONをさらにXMLに変換します。「作成」を使って以下のようにxml関数で囲みます。
xml(outputs('作成'))
できたXMLがこちら。
<root>
<Numbers>1396</Numbers>
<Numbers>882</Numbers>
<Numbers>755</Numbers>
</root>
#xpath関数で目的のタグの値を合計する
いよいよxpath関数を使います。合計したいのはの中身なので、式は以下のような形になります。
xpath(outputs('作成_2'),'sum(/root/Numbers)')