Power AppsからPower Automateへ値を渡すときに活躍する「JSONの解析」

# はじめに
`Power Apps`と`Power Automate`の連携、
**非常に強力な機能です。**

豊富なコネクタから、テクニカルな自動化まで一気通貫で担うことができます。

しかし、[Power AppsからPower Automateフローをトリガーする](https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/how-to/trigger-flow#trigger-the-flow-from-within-the-canvas-app)に当たり、
引数の設定が若干手間だったりします。

```plaintext:Power Apps
FlowtriggeredbyaPowerapp.Run(
   EditForm3.LastSubmit.Email,
   TextInput1.Text
);
```

> 引用元 [Microsoft learn](https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/how-to/trigger-flow)

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/how-to/trigger-flow

引数をPower Automate側で、あらかじめ設定しておく必要があります。

# [トリガー PowerApps (V2)](https://powerusers.microsoft.com/t5/Webinars-and-Video-Gallery/Power-Apps-V2-Trigger-In-Power-Automate/td-p/930199)を覗いてみる
Power AppsからPower Automateに、データを渡すときは、[PowerApps (V2)](https://powerusers.microsoft.com/t5/Webinars-and-Video-Gallery/Power-Apps-V2-Trigger-In-Power-Automate/td-p/930199) トリガーから、**変数の型**を指定して取得します。

```json
{
  "type": "Request",
  "kind": "PowerAppV2",
  "inputs": {
    "schema": {
      "type": "object",
      "properties": {
        "text": {
          "description": "入力を指定してください",
          "title": "入力",
          "type": "string",
          "x-ms-content-hint": "TEXT",
          "x-ms-dynamically-added": true
        },
        "boolean": {
          "description": "[はい] または [いいえ] を選択してください",
          "title": "はい/いいえ",
          "type": "boolean",
          "x-ms-content-hint": "BOOLEAN",
          "x-ms-dynamically-added": true
        },
        "file": {
          "description": "ファイルまたはイメージを選択してください",
          "title": "ファイルのコンテンツ",
          "type": "object",
          "properties": {
            "contentBytes": {
              "type": "string",
              "format": "byte"
            },
            "name": {
              "type": "string"
            }
          },
          "x-ms-content-hint": "FILE",
          "x-ms-dynamically-added": true
        },
        "email": {
          "description": "メール アドレスを入力してください。",
          "format": "email",
          "title": "電子メール",
          "type": "string",
          "x-ms-content-hint": "EMAIL",
          "x-ms-dynamically-added": true
        },
        "number": {
          "description": "数を入力してください",
          "title": "数",
          "type": "number",
          "x-ms-content-hint": "NUMBER",
          "x-ms-dynamically-added": true
        },
        "date": {
          "description": "日付を入力または選択してください (YYYY-MM-DD)",
          "format": "date",
          "title": "トリガーの日付",
          "type": "string",
          "x-ms-content-hint": "DATE",
          "x-ms-dynamically-added": true
        }
      },
      "required": [
        "text",
        "boolean",
        "file",
        "email",
        "number",
        "date"
      ]
    }
  }
}
```

[Power Automateの変数の型](https://learn.microsoft.com/ja-jp/power-automate/create-variable-store-values?tabs=classic-designer#examples-of-other-variable-types)に合わせて、Power Appsから値を受け取ることができます。

| 日本語表記 | データ型 |
|:-:|:-:|
| テキスト | text |
| はい/いいえ | boolean |
| ファイル | file |
| 電子メール | email |
| 数値 | number |
| 日付 | date |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/148bb666-5e50-bc0a-8e48-b75240c1c059.png)

## 値を呼び出す方法

[triggerBody関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#triggerBody)で値を受け取ります。

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

若干曲者ですが、[triggerBody関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#triggerBody)の引数は、`PowerApps (V2)`の中で暗黙的に決まります。
「引数はこれで正しいのかな🧐」と怖くなる時もあります。

パラメーターで名前を工夫しても・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/6b085a74-d090-dbce-b0aa-c34f654180c2.png)

引数は
- text
- number
- text_1

と自動的に決まってしまいます。

```json
{
    **引数!** "text": {
      "description": "入力を指定してください",
      "title": "入力",
      "type": "string",
      "x-ms-content-hint": "TEXT",
      "x-ms-dynamically-added": true
    },
    **引数!** "number": {
      "description": "数を入力してください",
      "title": "数",
      "type": "number",
      "x-ms-content-hint": "NUMBER",
      "x-ms-dynamically-added": true
    },
    **引数!** "text_1": {
      "description": "入力を指定してください",
      "title": "入力 1",
      "type": "string",
      "x-ms-content-hint": "TEXT",
      "x-ms-dynamically-added": true
    },
    **引数!** "text_2": {
      "description": "入力を指定してください",
      "title": "Text",
      "type": "string",
      "x-ms-content-hint": "TEXT",
      "x-ms-dynamically-added": true
    },
    **引数!** "text_3": {
      "description": "入力を指定してください",
      "title": "Str",
      "type": "string",
      "x-ms-content-hint": "TEXT",
      "x-ms-dynamically-added": true
    },
    **引数!** "number_1": {
      "description": "数を入力してください",
      "title": "Integer",
      "type": "number",
      "x-ms-content-hint": "NUMBER",
      "x-ms-dynamically-added": true
    },
    **引数!** "boolean": {
      "description": "[はい] または [いいえ] を選択してください",
      "title": "はい/いいえ",
      "type": "boolean",
      "x-ms-content-hint": "BOOLEAN",
      "x-ms-dynamically-added": true
    },
    **引数!** "boolean_1": {
      "description": "[はい] または [いいえ] を選択してください",
      "title": "はい/いいえ 1",
      "type": "boolean",
      "x-ms-content-hint": "BOOLEAN",
      "x-ms-dynamically-added": true
    }
}
```

画面で多くの引数を設定するのも、なんとなく手間を感じます。

# [JSON の解析](https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#json) を使う - シンプルな文字列

こんなときに私は、Power Automateの`データ操作`における`JSON の解析`を使用します。
`JSON の解析`を使うことによって、
**ひとつの文字列から、オブジェクトとして複数の値を受け取ることができるからです。**

試しに、`Power Apps`から`Power Automate`に**オブジェクト文字列を送信します。**

```plaintext:Power Automateに単純にコンテキスト変数でObjを渡す
UpdateContext(
    {
        Obj : {
            ObjectText: "Text",
            ObjectString: "Power Apps",
            Number: 365,
            Boolean: true,
            Date: Today()
        }
    }
);

ParseJSON.Run(JSON(Obj));
```


Power Automate側は、`文字列`として[JSON関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-json)の結果を受け取ります。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-json

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ec00bc32-37e0-db81-ca44-6f484220f24f.png)

:::note info
`JSON の解析`用に、`{}`だけ指定すると、オブジェクトの解析の許容範囲が広がるので、実験に最適だったりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/997d7c92-e897-b756-e40e-67c0a948f595.png)
:::

受け取る値はコチラ。

```plaintext:Power Appsの出力
{"Boolean":true,"Date":"2024-05-09","Number":365,"ObjectString":"Power Apps","ObjectText":"Text"}
```

こちらを、`JSON の解析`から`サンプルのペイロードを使用してスキーマを生成する`と

```json:Shema
{
    "type": "object",
    "properties": {
        "Boolean": {
            "type": "boolean"
        },
        "Date": {
            "type": "string"
        },
        "Number": {
            "type": "integer"
        },
        "ObjectString": {
            "type": "string"
        },
        "ObjectText": {
            "type": "string"
        }
    }
}
```

**サンプルに合わせて、データ型を定義し、**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/3603013e-5ab4-4667-cc14-9ceb22d27736.png)

```json:body('JSON_の解析')の結果
{
    "Boolean": true,
    "Date": "2024-05-09",
    "Number": 365,
    "ObjectString": "Power Apps",
    "ObjectText": "Text"
}
```

**後続の処理に使うことができます。**
文字列から値を評価するからこそ、なせるテクニックです。

https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#json

Power Appsの式エディタのほうが、コードエディタに近しい形で、変数を定義できるため、
Power Appsからまとめて値を送ってしまいたいな、というときに**便利**です。

:::note warn
値を厳密に評価するため、データ型が異なると、エラーになる原因にもなります。
※予定していた値が、`Null`の場合

```
UpdateContext(
    {
        Obj : {
            ObjectText: "Text",
            ObjectString: Blank(),
            Number: 365,
            Boolean: true,
            Date: Today()
        }
    }
);

ParseJSON.Run(JSON(Obj));
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/cef355a8-b54d-c6ce-4b4b-782c3a022026.png)

エラーにつながるため、沼にハマりやすいです。

:::

# 配列(Array)を渡すこともできる
[JSON関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-json)で、`JSONFormat.FlattenValueTables`を設定し、値配列を渡すと、

```plaintext:Arrayを渡すパターン
ParseJSON.Run(JSON(["a", "b", "cde"],JSONFormat.FlattenValueTables));
```
**Power Appsで、扱いづらかった配列が渡せます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/34314883-3ae0-f48c-b41e-479a315ca8e9.png)

# 配列にオブジェクトを格納して渡す
[私の記事の中で、かなり多く反響をいただいた記事](https://qiita.com/DEmodoriGatsuO/items/56c3324dae17a961e891)にも使用しましたが
、[Table関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-table)を`JSON`に変換して渡すことで、
**配列に格納されたオブジェクトとして評価され、動的な数の配列として使用することもできます。**

https://qiita.com/DEmodoriGatsuO/items/56c3324dae17a961e891

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-table

```plaintext:Power Appsの式
ParseJSON.Run(JSON(Table({Item:"Violin123",Location:"France",Owner:"Fabrikam"})))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/e2ffe6d0-6c9a-48af-7d5d-2a0586d25632.png)

# オブジェクト変数の中に、Table関数、値配列の場合
## - オブジェクトの中にTable関数
オブジェクトの中に、[Table関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-table)や`値配列`を含めて、解析を試みた場合、
**オブジェクトの中の配列として、活用ができます。**

```plaintext:Power Appsの式
UpdateContext(
    {
        Obj : {
            ObjectText: "Text",
            TableArray: Table({Item:"Violin123",Location:"France",Owner:"Fabrikam"},{Item:"Violin456",Location:"Chile"}),
            Number: 365,
            Boolean: true,
            Date: Today()
        }
    }
);

ParseJSON.Run(JSON(Obj));
```

解析を通じて、データ型が狙い通りに評価されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c4db5465-3a2c-d0b5-e201-8de4584806d5.png)


```json:Schema
{
  "type": "object",
  "properties": {
    "Boolean": {
      "type": "boolean"
    },
    "Date": {
      "type": "string"
    },
    "Number": {
      "type": "integer"
    },
    "ObjectText": {
      "type": "string"
    },
    "TableArray": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "Item": {
            "type": "string"
          },
          "Location": {
            "type": "string"
          },
          "Owner": {
            "type": "string"
          }
        },
        "required": [
          "Item",
          "Location"
        ]
      }
    }
  }
}
```


## - オブジェクトの中に値配列
値配列`[]`を内包してみると、どうなるでしょうか。

```plaintext:Power Appsの式
UpdateContext(
    {
        Obj : {
            ObjectText: "Text",
            TableArray: [1,2,3],
            Number: 365,
            Boolean: true,
            Date: Today()
        }
    }
);

ParseJSON.Run(JSON(Obj));
```

上記の場合、配列が`key:value`の形式になります。

```json:Schema
{
    "type": "object",
    "properties": {
        "Boolean": {
            "type": "boolean"
        },
        "Date": {
            "type": "string"
        },
        "Number": {
            "type": "integer"
        },
        "ObjectText": {
            "type": "string"
        },
        "TableArray": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "Value": {
                        "type": "integer"
                    }
                },
                "required": [
                    "Value"
                ]
            }
        }
    }
}
```

`JSON([1, 2, 3],JSONFormat.FlattenValueTables)`を使ってみると、

```plaintext:Power Appsの式
UpdateContext(
    {
        Obj : {
            ObjectText: "Text",
            TableArray: JSON([1, 2, 3],JSONFormat.FlattenValueTables),
            Number: 365,
            Boolean: true,
            Date: Today()
        }
    }
);

ParseJSON.Run(JSON(Obj));
```

`TableArray`が`文字列(string)`として評価されてしまいました・・・。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/6431b160-86fd-e204-2e17-799e83653856.png)

```json:Schema
{
    "type": "object",
    "properties": {
        "Boolean": {
            "type": "boolean"
        },
        "Date": {
            "type": "string"
        },
        "Number": {
            "type": "integer"
        },
        "ObjectText": {
            "type": "string"
        },
        "TableArray": {
            "type": "string"
        }
    }
}
```

なかなか奥が深い。

https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#json

# おわりに
なんとなくやりづらかった操作も活路が見えますが、
この`JSONの解析`を使うことによって、発生するエラーもあります。

**活用される場合は、エラーと向き合う覚悟をもちつつ、時と場合を考えて使ってみましょう！**

:::note info
記事の`いいね❤`や拡散は、著者が非常に喜ぶのでジャンジャンしてくださいね♪
:::


https://qiita.com/DEmodoriGatsuO/items/aabff4e30bba821c39b7

https://qiita.com/DEmodoriGatsuO/items/56c3324dae17a961e891