このエントリは2024/05/10現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容からの乖離が発生する可能性があります。
問い合わせ
Logic Appsで自身の身の回りの環境を便利にしようとしている人から、以下のような問い合わせが届いた。この方もお初の人。
最近Outlookコネクターをトリガーとし、添付ファイルをBlob Storageに格納するようなフローを再作成したのだが、以前とフローが変わっていて混乱している。そしてこのフローのままテストすると期待した通りに動作しない。動作させるにはどうすればいいか?また、以前と同じ構成にするにはどうしたらいいか?
以前がどういうものだったのかを知りたかったので、もうちょっとつっこんで聞いてみた。以前は以下のような感じ。

ただ、現在は以下のように、二重ループが構成されている、とのこと。確かに手元の環境でもデザイナーを使うとそのように構成されていた。

で、この二重ループのまま実行すると、以下のようなエラーメッセージが出て、ワークフローが動作しない、ということのよう。
InvalidTemplate
Unable to process template language expressions for action ‘For_each_1’ at line ‘0’ and column ‘0’: ‘The template language expression ‘triggerBody()[‘value’]’ cannot be evaluated because property ‘value’ doesn’t exist, available properties are ‘Id, DateTimeReceived, HasAttachment, InternetMessageId, Subject, BodyPreview, Importance, ConversationId, IsRead, IsHtml, Body, From, To, Cc, Bcc, ReplyTo, Attachments’. Please see https://aka.ms/logicexpressions for usage details.
この二重ループの意図
Outlookコネクターは着信メールを1件ずつ取得するわけではなく、ポーリングのタイミングで着信したメールを取得している。そのため、コネクターは複数のメールを取得する場合がある。
複数のメールを1回のフローで操作できるよう、外側のループ(For_each_1)でメールの件数だけループしようとしており、この外側のループのパラメータとして、エラーメッセージ中のtriggerBody()['value']を設定している。これは1回の呼び出しで取得できたメールをそのまま外側のループに渡している、ということ。
この設定の場合、この外側のループが動作するためには着信メールをdebatching(1件ずつにばらすこと)してはいけないのだが、Outlookコネクターの設定を見ると、Split OnがOnになっており、ループしようにもループできない、というのが、期待したとおりの動作をしない原因。
配列で複数の実行をトリガーする / Trigger multiple runs on an array
https://learn.microsoft.com/azure/logic-apps/logic-apps-workflow-actions-triggers#trigger-multiple-runs-on-an-array

解決策
解決策は非常に簡単で、このSplit OnをOffにすれば、この二重ループで順繰りに(直列に)処理できるようになる。

旧来の動作に戻したい
上記の解決策では順繰りにメールを処理しているが、これでは大量のメールが届いたときに処理時間がかかってしまう。そこで、並列処理できるよう、メールを1件ごとにばらす、つまりSplit OnプロパティをOnにすればうまく行きそうに思えるが、単純にFor eachループをデザイナーで移動させた場合、Split OnプロパティをOnにしただけでは動作しない。それはループのパラメータが変わっているからである。
コードビューで確認すると、パラメータとして以下の値が設定されている。
"foreach": "@item()?['Attachments']",
これはメールの配列要素のAttachments配列を参照しようとしているのだが、並列処理できるようdebatching、つまりSplit OnプロパティをOnにした場合、もはやメールは配列ではない。そのため、
"foreach": "@triggerBody()?['Attachments']",
と、トリガーで取得したAttachments配列を参照する必要がある。設定自体は簡単だが、デザイナーで見るとまったく同じなので、見分けが付きにくいという点に注意が必要。
あと、debatchingの結果生成された実行インスタンスを追跡するにあたり、Split-On Tracking IDなる値を設定してもよい。今回はメール1件ごとに処理しているので、メールのIDを使うことにした。以下の@triggerBody()?['id']がそれに相当する(追加しなくても動作する)。
