Microsoft Flowは、基本型・配列・マップ(オブジェクト)などのデータ種類があるのですが、操作はGUIでラップされているため、どうすればデータから目的の要素の値にたどりつけるのかが、とても理解しづらいです。
値への参照方法を知っていれば簡潔に書けるところを、マウスであーでもないこーでもないと試行錯誤の末に、やっとできるようになるといったことはよくあります。
なので、Flow特有の仕様には踏み込まない程度に、ざっくりとFlowでのデータ参照方法について整理しておこうと思います。
テスト環境準備
簡単なテストFlowを用意して、実際に色々試してみると分かりやすいです。
[アクション]-[データ操作]-[作成]で任意の入力でデータを作成できるので、「test」データを作成して、それを入力に「out」データを作成することにより、Flowではデータをどう操作するのかを試してみます。
例えば、「test」に数値「12345」をセットして、「out」に「test」をそのまま入力するFlowを作ります。
結果は「out」が数値「12345」となっています。
参照名を知る方法
「out」に「test」を代入する場合、「test」を手で入力する必要はなく、「動的なコンテンツ」のリストに現れるので、 そこからマウスでクリックすればセットされます。
セット前
セット後
しかし、この親切設計が逆に、式の中で「test」を使いたい時に、どう手入力していいかを分かりにくくしています。
「test」の手入力による参照方法は下記の手順で簡単に知ることができます。
手順
1、「動的なコンテンツ」から[test]-[出力]を選んで、「out」の入力に「test」を設定する
2、「出力」を選択(Shift+左矢印)
3、Ctrl+Cでコピー
4、メモ帳などに貼り付け
すると、下記のようなテキストが貼り付けられます。
@{outputs('test')}
「@{}」を除いた「outputs('test')」が、「out」の入力「出力」の正体です。
式に「outputs('test')」と書くのと、「動的なコンテンツ」から[test]-[出力]を選ぶのとは等価です。
基本この書き方で、「式」の中で「動的なコンテンツ」を参照することができます。
データ要素参照方法
Flowでの、配列の要素や、マップの要素への参照方法です。
配列の要素にアクセスする
obj[<idx>]
でアクセスできます。
outputs('test')[1] // 2番目の要素を取得
実行結果
マップの要素にアクセスする
obj.<colName>
でアクセスできます。
outputs('test').col1 // col1の要素を取得
実行結果
要素名が日本語や、スペースを含む場合でも参照できるよう、下記の方法で、要素名を文字列で指定して参照することもできます。
obj?['<colName>']
でアクセスできます。
outputs('test')?['col1'] // col1の要素を取得
実行結果
実践
例えば、ループ「Apply to each」内であっても、「動的なコンテンツ」の参照名は同様のやり方で取得できます。
ループの「現在のアイテム」はitems('Apply_to_each')
となるので、そこから「id」を取得するにはitems('Apply_to_each').id
とします。
実行結果
他の色々なコネクターから取得したデータであっても、
- 「動的なコンテンツ」の参照名を調べる
- 配列・マップのアクセス方法を利用する
ことにより、目的の要素にアクセスすることができます。
例えば、「データベースのクエリ結果の最初のレコードのカラム「id」の値を取得」もbody('query').ResultSets.Table1[0].id
一発で可能です。
実行結果
@について
「@」や「@{…}」という記述がよく出てきますが、これは、文字列の中で変数や式を展開する時に使います。
例えば、ループの中でアイテムを何かしらのアクションでJSONのデータで渡したい場合、下記のように記載します。
{ "body": "@{items('Apply_to_each')}はアイテムデータです" }
「@」も「@{…}」も機能は同じで、展開の範囲を明示する場合に「@{…}」を使います。
また、「@」を展開ではなく文字として使いたい場合は「@@」と2回書きます。
感想
今までアクションのみでデータ参照していたのですが、記述がシンプルになり、一気に見通しが良くなりました。