MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

item()とitems('Apply_to_each')の違い・使い分け

Power Automate/Logic Appsでループが発生するときによく出てくる items('Apply_to_each') について新しい発見があったのでまとめます。

動的コンテンツで挿入するときには「現在のアイテム」として挿入されるものです。関数で書くとこれが items('ループ名') になります。

items()についての詳細はDocsに。

式関数のリァレンス ガイド - Azure Logic Apps | Microsoft Docs

f:id:mofumofu_dance:20200905103627p:plain

一方で、配列に対するアクションでよく使う item() ですが、式関数ガイドによると

配列に対する繰り返しアクションの内部で使うと、アクションの現在の繰り返しの間に配列の現在の項目を返します。 その項目のプロパティから値を取得することもできます。

とあります。よく使うのはSelect, Filter, Create HTML tableあたりでしょうか。

f:id:mofumofu_dance:20200905104915p:plain

この2つの関数、似ているようで使いどころが違うようで、かなり混乱のもとなんですよね。今回はその2つの違いを調べてみました。

結論から言うと 全部 item() でいいじゃん! です。

item() は Apply to each でも使える

まずはこの事実が新たな発見でした。

item() は Apply to each の中でも使えるのです。 その際にはDocsに書いてある通り、ループの現在の項目を表します。

f:id:mofumofu_dance:20200905105945p:plain

Apply to eachを2重にしてみると、そのスコープがもう少し明らかになる気がします。

Apply to each (親) のなかに Apply to each (子) を入れると、子のループのitem()では子ループの配列を参照しています。

f:id:mofumofu_dance:20200905110507p:plain

ここで items('Apply_to_each') がなぜループ名を指定するのかが分かります。

子ループの中で親ループの「現在のアイテム」を参照したい場合、item()では参照できないんです。なので、items('Apply_to_each')で親ループの名前を指定して「現在のアイテム」を参照するんです。

単一のループ処理でも、もちろんループ名を指定すれば現在のアイテムを指定できます。

f:id:mofumofu_dance:20200905111042p:plain

親ループでitem()を「作成」すればいい

これは John Liuに教えてもらいました。 全部item()だけでいけます。

イメージは下図のとおり。 子ループの中で親ループのアイテムを見たいときには、子ループの前に「作成」(Compose)アクションで親ループの「現在のアイテム」を作っておきます。

f:id:mofumofu_dance:20200905111916p:plain

こうすると、子ループの中ではoutputs('作成')で親ループのアイテムが見えます。

この方法のいいところは、ループの実行結果で今どのループアイテムを参照しているのかが一目瞭然になるということです。

f:id:mofumofu_dance:20200905111854p:plain

ということで、items('Apply_to_each')はあまり使わなくていいかもしれません。 (覚えることが一つ減った!)