Power Automate/Logic Appsでループが発生するときによく出てくる items('Apply_to_each')
について新しい発見があったのでまとめます。
動的コンテンツで挿入するときには「現在のアイテム」として挿入されるものです。関数で書くとこれが items('ループ名')
になります。
items()についての詳細はDocsに。
式関数のリァレンス ガイド - Azure Logic Apps | Microsoft Docs
一方で、配列に対するアクションでよく使う item()
ですが、式関数ガイドによると
配列に対する繰り返しアクションの内部で使うと、アクションの現在の繰り返しの間に配列の現在の項目を返します。 その項目のプロパティから値を取得することもできます。
とあります。よく使うのはSelect, Filter, Create HTML table
あたりでしょうか。
この2つの関数、似ているようで使いどころが違うようで、かなり混乱のもとなんですよね。今回はその2つの違いを調べてみました。
結論から言うと 全部 item() でいいじゃん! です。
item() は Apply to each でも使える
まずはこの事実が新たな発見でした。
item() は Apply to each の中でも使えるのです。 その際にはDocsに書いてある通り、ループの現在の項目を表します。
Apply to eachを2重にしてみると、そのスコープがもう少し明らかになる気がします。
Apply to each (親) のなかに Apply to each (子) を入れると、子のループのitem()
では子ループの配列を参照しています。
ここで items('Apply_to_each')
がなぜループ名を指定するのかが分かります。
子ループの中で親ループの「現在のアイテム」を参照したい場合、item()
では参照できないんです。なので、items('Apply_to_each')
で親ループの名前を指定して「現在のアイテム」を参照するんです。
単一のループ処理でも、もちろんループ名を指定すれば現在のアイテムを指定できます。
親ループでitem()を「作成」すればいい
これは John Liuに教えてもらいました。 全部item()だけでいけます。
イメージは下図のとおり。 子ループの中で親ループのアイテムを見たいときには、子ループの前に「作成」(Compose)アクションで親ループの「現在のアイテム」を作っておきます。
こうすると、子ループの中ではoutputs('作成')
で親ループのアイテムが見えます。
この方法のいいところは、ループの実行結果で今どのループアイテムを参照しているのかが一目瞭然になるということです。
ということで、items('Apply_to_each')はあまり使わなくていいかもしれません。 (覚えることが一つ減った!)