XPath を活用した集計

Published: / Last update: / Contributors:
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」アクションのアクション名です。

実行結果:

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

最後に

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

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