#PowerApps のJSON関数を使ったFlowへのパラメータ渡し

# はじめに
PowerAppsでは2019年6月、PowerAppsでのコレクション、レコード、テーブル等をJSON(JavaScript Object Notation)形式に変換する関数が登場しました。
昨今では様々なWebサービスがデータの受け渡しにJSON形式を採用しており、PowerAppsでの関数追加も、これらのサービスを活用するためのものと思われます。
また、「[SharePoint REST APIでフィールドを作成する際の自分メモ](https://qiita.com/h-nagao/items/f45c742a28a2a058d2a7)」 でも触れていますが、 SharePoint REST APIをFlowで実行する際にも、JSON形式でのデータ渡しは有効です。

今回はPowerAppsからFlowへのパラメータ渡しを中心に、JSONの利用方法を紹介します。

# JSON関数の書式等
PowerAppsにおけるJSON関数の公式ドキュメントは[こちら](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-json) を参照してください。

**構文**
#### JSON(DataStructure [, Format ] )
- DataStructure:必須。JSON に変換する元データ。 テーブル、レコード、その他のデータを指定します。入れ子のテーブルでもOK
- Format:省略可能。省略した場合には ```JSONFormat.Compact```が採用されます。

JSON関数では、変換元のデータにPowerApps上のメディア(カメラコントロールの写真、画像の追加コントロールの追加アイテム、マイクの音声)のdatauriも生成することができます。その際には```JSONFormat.IncludeBinaryData```を指定してください。

# Flowへのパラメータ渡し
どういうときにFlowにJSON形式でデータを渡すのがいいのか。個人的には**複数パラメータがあればJSONが吉**と思います。
または複数のデータ（テーブル）をFlowに渡してループ処理したい場合にも有効です。

テーブルデータをFlowに受わすことは、基本的にはできません。
また、複数のパラメータを「PowerAppsで確認」とした場合、いったん保存してPowerAppsで使った後、パラメータを追加・削除するにはPowerAppsから該当するFlowを削除し、Flowを保存後にまた登録しなおす作業が必要になります。
例えば下図では、メール送信の送信先(To)、件名、本文を[PowerAppsで確認]としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/ea3fb9c7-151e-1209-03cd-2c0c659b348c.png)

もしこれに**「CCもPowerApps側で指定したい！」**となった場合、または、**「送信先は固定でよかった」**となった場合には、対象のパラメータを追加・削除して、Flowを保存。PowerApps側でも一度Flowを消し、再度追加する必要があります。
また、基本的にはテーブルを渡せないので、例えば複数の画像をSharePointドキュメントライブラリに保存したいとなった場合には、これまではN回Flowを実行していました。
このようなデータの受け渡しも、JSON関数を使うことで容易に実現できます。
（利用例は「[#PowerApps のJSON関数を利用した写真の一括登録](https://qiita.com/h-nagao/items/1e89e16fe59d458bd4d1)」で紹介しています。）

## 複数パラメータを渡す
先に紹介したメール送信の例では、3つのパラメータをレコードから生成されたJSONとして渡すことができます。こうすることで、PowerApps→Flowとしては1つのパラメータで完結することができますし、それぞれを独立に修正できます。（パラメータ追加・変更に強い）
Flow側は以下のように変更されます。受け渡されるパラメータは、Parse JSONアクションの入力のみです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/759b8a8c-d4db-ec43-58e0-d297e2ec5c74.png)

では3つのパラメータを含むJSONをPowerAppsでどのように作成するのか見ていきます。
とても単純ですが、渡すパラメータのもとになる値と適当な列名でレコードを作成し、変数にセットします。※列名はParse JSONのスキーマと一致する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/32724770-4608-5121-bfc9-bcdca6251182.png)
その後、生成した変数をFlowの入力に渡すだけで完了です。

```Button.OnSelect
Set(
    sendmail,
    //レコード形式でJSON作成
    JSON(
        {
            To: txinToAddress_1.Text,
            Subject: txinSubject_1.Text,
            body: txinBody_1.Text
        },
        JSONFormat.IndentFour
    )
);
//Flowに渡すパラメータにJSONを指定
SendEmailJSON.Run(sendmail);
```
このように
**PowerApps側：複数パラメータでレコードを作成、レコードをJSONで変換、Flowに受け渡し**
**Flow側：PowerAppsから渡されたパラメータをパース。後続処理で利用**
とすることが、JSON関数で可能になります。
※これまでも頑張って文字列結合でJSONを作ることはできましたが、いまでは用意された関数で一発です！

## テーブルデータを渡す
テーブルのデータをFlowに受け渡すことも、JSONを使えば容易に実現できます。
以下のようなCollectionを例にすると、
```JSON( Collection_Name , IndentFour )```
をボタンのOnSelectか、Flowのパラメータに直接入力することで、図の下側にあるようなJSONデータを渡すことができます。
※最初はラベルで表示しておくと、Parse JSONのスキーマ作成時に、例をもとに～とできて便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/f7280ad7-55ee-c4a3-f15a-db6d267ca3d3.png)

Flowでは、このテーブルデータをParse JSONアクションでパースして、後続のループ処理等に利用します。
先ほどとの違いは、JSONのスキーマの一番外側がarray型になっていることです。
後ろのステップでは、渡されたJSONの各レコードに対して、メールを送信するようなアクションを定義しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/025b7a99-d203-9570-7232-d79c71543c93.png)


このように、JSONを利用して、複数パラメータのFlowへの受け渡しを簡略化したり、テーブルデータをFlowに渡してループ処理といったことも可能になりました！
超便利です！ぜひ使ってみてください！

再度ですが、
利用例は「[#PowerApps のJSON関数を利用した写真の一括登録](https://qiita.com/h-nagao/items/1e89e16fe59d458bd4d1)」で紹介しています。

# 余談
これまではJSON関数がなかったので気合で文字列結合してJSONを作っていました。
このくらい大変さが違います^^;
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/3582af58-c2de-3dcb-1ff4-cae95da6a08b.png)