Power Automateで配列の数値をループを使わず高速に合計する

2023/02/19

配列にならんだ [1,2,3,4,5]のような数値の合計を出したいようなケースはありますが、残念ながらPower Automateにはこれを直接できる関数は内容です。ループを用いて足しこめばよいですがとても遅い。そこで、xPath関数を使った方法を見つけましたので紹介します。

こちらの内容、Qiitaにも投稿しました!

かなり探してたどりつたのが上記のサイトです。

この技は例えばJSONで取得したファイルサイズを合計するようなケースで利用できそうです。xPathでの合計を実行する際には、まず数値を[1,2,3,4,5]のような配列の形にする必要があります。これについては「JSONからシンプルな配列に高速に変換する」を参考にしてください。

xPath関数をつかう

アレイ変数に[1,2,3,4,5]という配列を用意しました。つぎに、「作成」を使ってrootの下にNumbersというキーのあるJSONを作成します。Numbersの値は最初に作ったアレイを動的にはめ込みます。

テストを実行してみると、作成の中身はこんな感じになります。この段階では典型的なJSONです。

{
  "root": {
    "Numbers": [
      1,
      2,
      3,
      4,
      5
    ]
  }
}

もう一つ「作成」を作成します。その中にはxpath関数をつかった下記のような式をいれます。

xpath(xml(outputs('作成')),'sum(/root/Numbers)')

JSONがxml関数でXMLに変換されていますね。

いよいよ実行してみると、結果として配列の中身 1+2+3+4+5の合計15が取得できました!!

xpath関数って?

DOCSでxpath関数について解説されている部分です。

XML で XPath (XML Path Language) 式と一致するノードまたは値を調べて、一致するノードまたは値を返します。 XPath 式または単に “XPath" は、XML コンテンツ内のノードまたは計算値を選択できるように、XML ドキュメント構造内の移動を補助します。

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#xpath

なるほど。さっきの式 「xpath(xml(outputs('作成’)),’sum(/root/Numbers)’)」を見ると、xpathの第1引数には、もともとJSONである作成のoutputsをxml関数を使ってxmlに変換しています。

xpath関数はxmlの中から指定したノード(今回の場合は「/root/Numbers」)を取り出してsum関数に渡しているようです。このsum関数はPower Automateの関数ではなく、XPath 式の関数らしい。XMLの中から適切な値を抽出することができる式なんですね。

DOCSをよむと、特定の条件を含んだノードだけを抽出するということもできるようです。うまくつかうとPowerAutomateの条件をつかわずに、特定の条件の場合のみ足しこむというような処理もできそうです。

かなり強力でレアな方法?

数値を合計する方法はいろいろ探しましたがなかなかこれだけ一発で高速に処理できる方法は見つかりませんでした。レアで強力な手法だと思いますので、ぜひ活用してください。

ほかにもPower Automateの逆引きTIPSを紹介していますのでお役に立てるとうれしいです。