MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

ループを使わず配列の和をとる方法 (日本語解説)

f:id:mofumofu_dance:20210301234106p:plain

この投稿はPieter Veenstraの以下のブログ記事の日本語解説+応用です。

sharepains.com

Pieterは今回の記事のほかにも様々な素晴らしい投稿をしているので、ぜひチェックしてください!

今回のテーマとこれまでの方法

Power Automate ではいまだに Sum関数 や Average関数が提供されておらず、何らかの数列の和をとるためには Apply to eachのループ処理が不可欠でした。

f:id:mofumofu_dance:20210301222426p:plain
これまでの計算方法 (ループ利用)

考え方自体はシンプルですが、ループ処理でかつ変数を使うフローは非常に遅いという欠点があります。

今回解説する Pieterの方法では、ループを使うことなく数列の和を計算することが可能 です。ただし少し Logic Apps/Power Automate の数式を利用する点で直観的なわかりやすさとはトレードオフになっています。

ポイントはずばり 数値を文字列の長さに置き換える ことです!

解説

Pieterの方法で重要なのは『数値を文字列の長さに置き換える』という考え方です。

まず充分な長さの文字列を用意します。この文字列は特に制限はありません。とにかく充分な長さが確保されていることが前提です。

例として 5 + 8 を計算してみます。

5という数値を文字列 (12345 のような) の長さ としましょう。同様に8という数値は文字列長で8文字 (12345678 のような) と置き換えます。

この2つの文字列を結合した文字列の長さは自明ですが13文字になります。

f:id:mofumofu_dance:20210301225157p:plain
図解

この操作を Logic Apps/Power Automate で考えてみると、

  1. 数値から文字列に対応する長さを抽出する操作 = substring()関数
  2. 文字列を結合する操作 = join()関数
  3. 最終的な文字列のカウント = length()関数

これらの関数を利用することで図のような操作が実現できます。

f:id:mofumofu_dance:20210301231019p:plain
対応するPower Automateの操作

ここまで理解できればあとは簡単です。フローの全体像と各ステップの処理は以下をご覧ください。

f:id:mofumofu_dance:20210301232045p:plain
フローの全体

応用

これだけでもすごいのですが、ここまで読んでいただいて「あれ?小数点のある数値は扱えないのか?」と思ったかもしれません。原理的には、期待される計算結果に対して十分に長い文字列を確保できていれば、以下の操作を最初に施しておいて、あとはPieterの方法で対応できます。

  1. 初期の数列に 必要な小数点の桁数分ずらすだけ10のべき乗をかけて整数にする (例: 12.34 なら 100 をかけて 1234にする)
  2. Pieterの方法で輪を計算
  3. 計算結果の小数点をもとの位置に戻す (1.の例では100でわる)

なお、適当な長さの文字列を簡単に作るためには range()関数が有効です。

@{join(range(1,100000),'')}

こんな式を最初の定義に入れてあげれば50万文字の文字列が生成できます。

f:id:mofumofu_dance:20210301233513p:plain
小数を扱う場合の例

「負の数が含まれる場合は?」これはいいレッスンなので考えてみてください。

このように、今までループ計算をしていて非常に遅かった単純な数列の和が、ループなしで0秒で計算結果を出してくれるようになりました!

すごい!ぜひ必要になった時のために、一度試してみてください。