MoreBeerMorePower

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

Power AutomateでJSON配列の値を更新する方法3選

f:id:mofumofu_dance:20220401222238p:plain

Power Apps では コレクションの中のアイテム・値を更新するときにUpdateIf関数を使いますが、Power Automateではどうやって実現したらよいでしょうか。

コレクションそのものではありませんが、Power AutomateではJSON配列をしばしば変数などで定義、利用することがあります。

今回の投稿では、Power Automate における "UpdateIf" の操作に対応するフローを3パターンご紹介します。

前提として、今回利用するJSON配列のサンプルは以下のものです。

[
    {
        "name": "Sydney, Walker",
        "department": "Sales",
        "departmentCode": "5015"
    },
    {
        "name": "Camila, Taylor",
        "department": "HR",
        "departmentCode": "9001"
    },
    {
        "name": "Alisa, Walker",
        "department": "Sales",
        "departmentCode": "5015"
    },
    {
        "name": "Connie, Hamilton",
        "department": "Technology",
        "departmentCode": "1201"
    },
    {
        "name": "Victor, Riley",
        "department": "Finance",
        "departmentCode": "3303"
    }
]

この中で、Sales部門の部門コード (departmentCode) を 3800 に更新する操作を取り扱います。

パターン 1 : ループさせる

もっとも単純には、ループ (Apply to each/For each) を利用して、条件分岐で配列を更新していくパターンが考えられます。

この場合のフローは以下のようになります。

f:id:mofumofu_dance:20220401215436p:plain

特に難解な部分はないかなと思います。順次処理で、条件にマッチしたら更新して最終の配列変数に追加という感じです。

この処理の結果、期待通りのJSON配列ができあがります。

f:id:mofumofu_dance:20220401215656p:plain

パターン 2 : 一度文字列にして置換

2つ目は関数をいくつか利用する方法です。

この場合は

  1. まずもとのJSON配列を文字列化する
  2. 文字列の中で"departmentCode":"5015" な部分を"departmentCode":"3800" で置き換える
  3. 文字列を再度JSON配列に戻す

というステップをふみます。

f:id:mofumofu_dance:20220401220529p:plain

文字列化には string()関数を利用し、文字列の置換は replace()関数を、最後のJSONに戻す部分では json()関数をそれぞれ使っています。

関数の組み合わせは発生しませんし、対象のプロパティをもろに書き換えているのでそういう意味では直感的かなと思います。

一方で、置き換え前の値を知っている必要があるので、複数のパターンがあるようなケースだと replace関数を複数回実行することになり複雑さが増します。

結果はループの場合と同様です。

パターン 3 : 1アクションで実行!ただし関数利用

最後は1アクションで済ませる方法です。(パターン2も関数を全部くっつければ1アクションで終わるといえば終わる)

この方法では Selectアクションとif()関数を利用します。

f:id:mofumofu_dance:20220401221034p:plain

この場合はパターン1と同様に、最初にJSONの解析を入れています。

Selectアクションではオブジェクトの構造、キーと値を指定します。これを利用して、departmentCodeの部分に条件分岐である if()関数を入れるわけです。

関数の中身は

if(equals(item()?['department'],'Sales'),string(3800),item()?['departmentCode'])

となっています。 『もしアイテムのdepartmentがSalesだったら、文字列型で3800を、それ以外の場合にはもとのdepartmentCodeを使う』という意味の関数です。

これはちょうどパターン1のループ処理をループを使わない処理に置き換えたものになっています。

※ループ処理を使うフローでループを除去するようなアプローチについては過去の投稿をご覧ください。

mofumofupower.hatenablog.com

この方法は関数を使って、それを組み合わせていること、Selectアクションの使い方に慣れていることが求められるので、中級者向けという感じでしょうか。

ただ大量のデータであっても処理は0秒で終わるので、他のことに余剰の時間を回せるというメリットももちろんあります。

おわり

今回はPower Automate でJSON配列の値を更新する方法を3つ紹介しました。

他にもいろいろと方法は考えられますが、難易度と簡潔さを考えるとこの3つが代表的かなと思います。

フローの全体の構成や、処理にかけていい時間、メンテナンスのしやすさ (作成者のPower Automateへの慣れ具合) など考慮して最適な方法を選択できればよいでしょう。