追記(2019/08/06)
PowerAppsからFlowには、String型のデータしか渡せないため、手動でマップデータをString化していたのですが、JSONデータをString化する関数が追加されていたんですね!
これで手軽にデータを渡せるようになりました!データソース・コレクションもデータとしてFlowに渡せるようになって、めちゃめちゃ便利になりました!
詳細は上記記事を参照ください。
参考までに、元記事も新しい関数を使ったものに更新しておきました。
追記(ここまで)以下元記事
Microsoft PowerAppsはコーディングができないため、PowerApps単体では、UI表示と画面遷移くらいのことしかできません。
なので、より凝った処理を行う際は、Microsoft Flowを呼び出して、Flowにやってもらうことになります。
その際、PowerAppsからFlowにデータを渡して、FlowからPowerAppsに結果データを返すことになるのですが、その時にやり取りできるデータは、下記のようにかなり貧弱です。
- PowerAppsからFlowに渡せるデータは、Flowで事前に決めた個数の、Stringデータのみ
- FlowからPowerAppsに返せるデータは、Flowで事前に決めた、Number・String・Bool・Date・File・Mailの、いづれか1個のデータのみ
これだとあまりにも使いづらいので、もう少し工夫して、FlowにMapデータを渡して、Arrayデータを返す方法について記載しました。
PowerAppsとFlowの連携について
PowerAppsとFlowの連携の仕様は、かなりクセがあるので、ざっくり説明しておきます。
- FlowがPowerAppsからどういうデータを受け取り、どういうデータを返すかは、FlowとPowerAppsを連携する前に、Flow側で決めておく必要がある
- FlowがPowerAppsから受け取れるデータは、事前に決めた個数のStringデータのみ
- FlowがPowerAppsから受け取るStringデータは、FlowのGUIで
「PowerAppsで確認」
をクリックした時に登録される - FlowがPowerAppsから受け取るStringデータの引数の順番は、FlowのGUIで
「PowerAppsで確認」
をクリックした順になる - FlowがPowerAppsから受け取るStringデータの引数の順番や個数は、後から変更できない
- FlowからPowerAppsへの応答は、Flowの
[Action]-[PowerApps]-[PowerAppsに応答します]
で行う - FlowとPowerAppsの連携は、まずFlowを作っておき、PowerAppsの
[Action]-[Flows]
で行う - FlowとPowerAppsを連携させると、FlowからPowerAppsに、やり取りするデータのスキーマ情報が渡される
- Flowで受け取るStringデータの個数を変更したり、FlowからPowerAppsに返すデータの型を変更した場合は、一旦FlowとPowerAppsの連携を解除し再度連携し、 PowerAppsに渡されたスキーマ情報を更新する必要がある。更新しないと、PowerAppsからFlowを呼び出した際に、スキーマが違うとエラーになる
これだけだと何を言ってるか分からないと思うので、もう少し説明を…。
例えば、Flow側でFlowが受け取るStringデータの引数を追加するには、Stringデータを使用したい場所で、「PowerAppsで確認」
をクリックします。
「PowerAppsで確認」を3回クリックすると、下記のように「作成入力」「作成入力1」「作成入力2」の3つのString値が自動で作成され、Flowを呼び出す引数に順番に割り当てられます。
Flow呼び出しスキーマ(押した順になっている)
このFlowをPowerAppsから呼び出すには、PowerAppsとFlowを接続して、PowerAppsから
<Flow名>.Run("test01", "test02", "test03")
でFlowを呼び出します。
Flowを呼び出す時に設定したString引数が、そのままFlowで受け取る値になります。
注意点
String引数の登録は「PowerAppsで確認」のクリックでしか行えず、一度登録すると後から削除したり、順番を変えることはできません…。
これがめちゃめちゃ使いにくいのですが、仕様なので仕方ありません……。
以上の仕様を念頭に置いて、FlowにMapデータを渡して、Arrayデータを返す方法の解説です。
FlowにMapデータを渡す方法
方針としては、PowerAppsにはJSONデータをStringにする関数があるので、送りたいデータをJSONで構成し、それをStringにしてFlowに送ります。
一方Flowには、StringデータからJSONを作成する関数があるので、PowerAppsから受け取った文字列データを、JSONに復元します。
FlowはStringデータを1つだけ受け取るようにして、それをJSON()を通して[Action]-[データ操作]-[作成]
に代入してMapを取り出します。
Flow側
式
JSON(triggerBody()['test_入力'])
PowerApps側 Flow呼び出し例
テキストボックスの値と、コレクションをマップデータとしてFlowに送る
式
<Flow名>.Run(JSON({item1:TextInput1.Text, item2:TextInput2.Text, table:tbl_test}))
エディタ
実行中
Flow側 呼び出された結果
Flow側で、JSONデータ(マップデータ)が復元されています。
FlowからPowerAppsに、Arrayデータを返す方法
通常、FlowからPowerAppsへの応答は、[Action]-[PowerApps]-[PowerAppsに応答します]
で行うのですが、[Action]-[要求]-[応答]
で行います。
すると、応答本文のJSONスキーマで定義した任意のデータ型を、PowerAppsに返すことができるようになります。
ただし、PowerAppsは「基本データ型」と「テーブル型(Mapの配列)」しかデータ型がないので、任意のJSONは返すことはできません。
つまり、基本データ型の1つの値のみか、[Map, Map, Map, …]といった、Mapの配列のどちらしか返すことができません。
基本データ型の1つの値を返すのは、[Action]-[PowerApps]-[PowerAppsに応答します]
と同じなので、ここではMapの配列の返しかたについて説明します。
手順
例えば、
[{col1:111, col2:"AAA"}, {col1:222, col2:"BBB"}]
といったデータを返したかったとします。
Flow側
[応答]-[詳細オプションを表示する]-[サンプルのペイロードを使用してスキーマを生成する]
で下記のような値を入れます
[ {"col1":111, "col2":"AAA"} ]
すると、よしなにJSONスキーマが作成されます。
次に、サンプルとして「本文」に返したいデータを入れます。
[ {"col1": 111, "col2": "AAA"}, {"col1": 222, "col2": "BBB"}, {"col1": 333, "col2": "CCC"} ]
PowerApps側
FlowからはMapの配列が返されるので、PowerApps側では、これをコレクションデータにして保存します。
ClearCollect('コレクション名', <Flow名>.Run(…))
実行結果
Flowの戻り値が、PowerAppsのコレクション(testCollection)に格納され、データが表示される
感想
ちょっと強引ですが、これでPower AppsからFlowにデータをマップで渡して、配列で返すことができるようになります。
PowerAppsとFlowの連携は発展途上な所があり、このあたりの仕様は今後変わりそうな気がしていて、これ以上は深入りしないでおきます…。