5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Power Automate】JSONから配列を作り、配列内の数値を合計する

Last updated at Posted at 2023-02-19

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
    }
  ]
}

「作成」に貼り付けて元データとして利用できるようにします。
image.png

「選択」を使ってJSONを配列に変換する

今度は「選択」を使います。元となるJSONは入れ子構造になっていますが、今回は人口部分だけを合計することが目的です。開始の欄には「prefectures」の中身を取り出すために以下のような式を設定します。

outputs('元データ')?['prefectures']

image.png
次に、「選択」のマップ右側にある「T」のようなボタンをクリックして、マップをテキストモードに切り替え、今度は人口だけを取り出すために以下のような式を設定します。

item()?['population']

image.png
これでテスト実行してみると、みごとに人口の数字部分だけが配列に変換されていることがわかります。
image.png

配列の数値を合計するには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]の配列部分は前工程で作成した結果をつかうので、画像の「出力」というのは「選択」の出力を使います。
image.png
結果はこんな感じのJSONになります。
image.png

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)')

image.png
最後にフローをテスト実行してみると、しっかり配列の値が合計されました!
image.png

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?