新しいことにはウェルカム

技術 | 電子工作 | ガジェット | ゲーム のメモ書き

Microsoft (Office365) PowerAppsからFlowに、マップデータを渡して、配列データを受け取る方法

追記(2019/08/06)

PowerAppsからFlowには、String型のデータしか渡せないため、手動でマップデータをString化していたのですが、JSONデータをString化する関数が追加されていたんですね!

qiita.com

これで手軽にデータを渡せるようになりました!データソース・コレクションもデータとして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を呼び出す引数に順番に割り当てられます。

Microsoft (Office365) PowerAppsからFlowに、マップデータを渡して、配列データを受け取る方法

Flow呼び出しスキーマ(押した順になっている)

Microsoft (Office365) PowerAppsから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_入力'])

Microsoft (Office365) PowerAppsからFlowに、マップデータを渡して、配列データを受け取る方法

PowerApps側 Flow呼び出し例

テキストボックスの値と、コレクションをマップデータとしてFlowに送る

<Flow名>.Run(JSON({item1:TextInput1.Text, item2:TextInput2.Text, table:tbl_test}))

エディタ

Microsoft (Office365) PowerAppsからFlowに、マップデータを渡して、配列データを受け取る方法

実行中

Microsoft (Office365) PowerAppsからFlowに、マップデータを渡して、配列データを受け取る方法

Flow側 呼び出された結果

Microsoft (Office365) PowerAppsから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"}
]

Microsoft (Office365) PowerAppsからFlowに、マップデータを渡して、配列データを受け取る方法

すると、よしなにJSONスキーマが作成されます。

Microsoft (Office365) PowerAppsからFlowに、マップデータを渡して、配列データを受け取る方法

次に、サンプルとして「本文」に返したいデータを入れます。

[
    {"col1": 111, "col2": "AAA"},
    {"col1": 222, "col2": "BBB"},
    {"col1": 333, "col2": "CCC"}
]

Microsoft (Office365) PowerAppsからFlowに、マップデータを渡して、配列データを受け取る方法

PowerApps側

FlowからはMapの配列が返されるので、PowerApps側では、これをコレクションデータにして保存します。

ClearCollect('コレクション名', <Flow名>.Run(…))

Microsoft (Office365) PowerAppsからFlowに、マップデータを渡して、配列データを受け取る方法

実行結果

Flowの戻り値が、PowerAppsのコレクション(testCollection)に格納され、データが表示される

Microsoft (Office365) PowerAppsからFlowに、マップデータを渡して、配列データを受け取る方法

感想

ちょっと強引ですが、これでPower AppsからFlowにデータをマップで渡して、配列で返すことができるようになります。

PowerAppsとFlowの連携は発展途上な所があり、このあたりの仕様は今後変わりそうな気がしていて、これ以上は深入りしないでおきます…。