XPath を活用した集計

Published: feedback 共有

こんにちは、Power Platform サポートの瀬戸です。
今回は、クラウド フローで、なるべく少ない手順で集計をしたいときに活用いただける Tips をご紹介いたします。

基本的な集計方法

例えば、下図のような数値の列を持つ SharePoint リストがあるとします。

この amount1、amount2 の列の合計を求めたい場合、素直に考えると Apply to each で数を集計することを考えます。

※ Apply to each を使った集計の例

合計値を求めるならこれでも良いのですが、この方法では、集計するだけで少なくとも リストの行数 × 集計したい列の数 の回数アクションが実行されます。データ件数が多いときや、他にもフローで行いたい処理があるときは、アクション要求数が気になってしまいます。

XPath を使った集計方法

XPath は、XML という形式のデータの位置を指定できる言語です。関数も用意されていて、集計 (sum) や個数のカウント (count) ができます。

Power Automate 上のデータは基本的に JSON 形式で扱われます。ですが、Power Automate には、JSON 形式を XML 形式へ変換する関数と、XPath の処理を行える関数がありますので、それらを使って集計を求められます。

以下に、XML と XPath を使って、先ほどの SharePoint リストを集計するサンプルを記載いたします。Apply to each を使用していない点にご注目ください。

フローの例

※フロー全体図

(1) 複数の項目の取得

SharePoint コネクタの「複数の項目の取得」アクションを使用し、リストを取得します。

パラメータ
サイトのアドレス リストがあるサイトを選択します。
リスト名 リストの名前を選択します。

(2) 選択

データ操作コネクタの「選択」アクションを使用し、集計に必要な列のみの配列を作成します。

パラメータ
開始 「(1) 複数の項目の取得」アクションの出力「value」
マップ 集計に必要な列の列名と値を指定します。

この例では amount1 列と amount2 列を集計したいので、その2つを指定します。

マップ-キー マップ-値
amount1 「(1) 複数の項目の取得」アクションの出力「amount1」
amount2 「(1) 複数の項目の取得」アクションの出力「amount2」

(3) 作成1

データ操作コネクタの「作成」アクションを使用し、配列をXML へ変換できる形へ整形します。

パラメータ
入力 {"root": {"numbers":「(2) 選択」アクションの出力 }}

XML はルート要素が 1 つという決まりがあるため、JSON のルートプロパティも 1 つにします。そして、ルート要素を配列にすることもできないため、もう 1 つ numbers というプロパティを加え、numbers を配列にします。

良い例:

1
2
3
4
5
6
7
8
9
{
"root": {
"numbers": [
{ "amount1": 1, "amount2": 2 }
,{ "amount1": 3, "amount2": 4 }
,{ "amount1": 5, "amount2": 6 }
]
}
}

上記の XML 変換後:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<root>
<numbers>
<amount1>1</amount1>
<amount2>2</amount2>
</numbers>
<numbers>
<amount1>3</amount1>
<amount2>4</amount2>
</numbers>
<numbers>
<amount1>5</amount1>
<amount2>6</amount2>
</numbers>
</root>

エラーになる例 1:

1
2
3
4
5
6
7
8
9
10
11
12
{
"root": {
"numbers": [
{ "amount1": 1, "amount2": 2 }
,{ "amount1": 3, "amount2": 4 }
,{ "amount1": 5, "amount2": 6 }
]
}
,"root2": { // ルート要素が2つになってしまうので NG
"numbers" : []
}
}

エラーになる例 2:

1
2
3
4
5
6
7
{
"root": [ // ルート要素は配列にできないので NG
{ "amount1": 1, "amount2": 2 }
,{ "amount1": 3, "amount2": 4 }
,{ "amount1": 5, "amount2": 6 }
]
}

(4) 作成2

データ操作コネクタの「作成」アクションを使用し、先のアクションの出力を XML へ変換します。

パラメータ
入力 以下を式として入力:
xml(outputs('作成1')) ※1

※1 「作成1」は「(3) 作成1」アクションのアクション名です。

参考 (xml 関数):https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#xml

(5) 作成-amount1

データ操作コネクタの「作成」アクションを使用し、XML へ変換した内容と XPath を使用して amount1 列の集計を求めます。

パラメータ
入力 以下を式として入力:
xpath(outputs('作成2'), 'sum(/root/numbers/amount1)') ※1

※1 「作成2」は「(4) 作成2」アクションのアクション名です。

参考 (xpath 関数):https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#xpath

(6) 作成-amount2

データ操作コネクタの「作成」アクションを使用し、amount1 と同じく amount2 の集計を求めます。

パラメータ
入力 以下を式として入力:
xpath(outputs('作成2'), 'sum(/root/numbers/amount2)') ※1

※1 「作成2」は「(4) 作成2」アクションのアクション名です。

実行結果:

amout1 と amount2 の集計を求められました。

最後に

ローコード ツールである Power Automate はできることが少ないと思いがちですが、やりたいことを意外な方法で解決できることもあります。ぜひご活用ください。

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。