このページの本文へ

松本典子の「はじめよう!Azure Logic Apps/Power Automateでノーコード/ローコード」 第12回

繰り返し処理のためのアクション、自動的にワークフローへ挿入されるのはなぜ?

Power Automateで「Apply to each」の仕組みと動作を理解しよう

2022年03月24日 08時00分更新

文● 松本典子 編集● 大塚/TECH.ASCII.jp

  • この記事をはてなブックマークに追加
  • 本文印刷

 こんにちは、Microsoft MVP(Azure / Business Applications)の松本典子です。

 本連載の前々回(第10回)前回(第11回)では、ユーザーが送信した写真から文字を読み取るLINEボットをノーコードで作成する方法を紹介しました。このうち、前回のワークフロー作成編では「Apply to each」というアクションを利用しています。

 前回はあまり詳しく説明しませんでしたが、実はPower Automateでワークフローを作成する際には、このApply to eachアクション※注を利用する場面が多くあります。また、ワークフローを作っているうちに自動的に挿入されることもあり、よく理解しないまま使っている方も多いかもしれません。

 そこで今回は、前回作成したワークフローを振り返り、また動作検証用のワークフローも作成しながら、Apply to eachがどのような働きをするのか、どんな場面で使うのかについて説明していきます。

※注:なお、Azure Logic Appsで同様の動作をするのは「For each」アクションです。名前が違うので注意してください。

1. 「Apply to each」アクションとは

 Apply to eachは、ワークフローの中でループ処理(繰り返し処理)を行うためのアクションです。組み込みコネクタの1つであるコントロールコネクタに含まれています。

コントロールコネクタは組み込みコネクタに分類されている

コントロールコネクタに含まれるApply to eachアクション

 ところで、Apply to eachを直訳すると「それぞれに適用する」となります。この「それぞれ」とはどういう意味でしょうか。

 それを理解するためにはまず「アレイ(配列)」について知る必要があります。アレイは変数の一種で、「一度に複数の値を保存できる変数」です。

 本連載第8回で作成したワークフローでは変数を使いました。変数は、ワークフローの中で何らかの値を一時的に保存しておく“名前付きの箱”のようなものです。たとえば第8回では「日付」という変数に、ワークフローを実行した日の日付(たとえば「2022-03-15」)を保存しています。このように、実行するたびに変化する値を扱うワークフローでは、変数の利用が欠かせません。

 ただし、ふつうの変数※注は一度に1つの値しか持てないため、用途によっては不便なこともあります。そこで活躍するのが、一度に複数の値を持てるアレイです。

※注:変数を初期化する際には、保存できる値の「型(タイプ)」も指定します。数値、文字列、ブーリアン(true/false)といった一般的な型の変数は、一度に1つの値しか保存できません。アレイ(配列型)を指定すると、複数の値が格納できます。

 ここでやっとApply to eachアクションの説明に戻ります。Apply to eachは、前のコネクタからアレイが渡されたときに、値を1つずつ順番に取り出して同じ処理を繰り返し実行します。つまり「それぞれの値に処理を適用する」のでApply to eachというわけです。アレイに格納された値をすべて処理し終えたら、繰り返し(ループ)を終了します。

 前回作成したLINEボットでは、トリガーとなる「HTTP要求の受信時」コネクタでLINEから取得する「events」が、複数の値を格納するアレイとなっています。このトリガーはLINEでメッセージ(写真)を受信したときに起動しますが、一度に複数のメッセージを受信しても処理できるようにアレイになっているのです。したがって、ワークフローの後続の処理をApply to eachアクションで繰り返すようにして、受信したすべてのメッセージに対して読み取り処理を実行しているわけです。

前回作成したワークフロー(Apply to eachの部分)

2. 今回作成するワークフロー

 Apply to eachアクションについての理解を深めるために、今回は同じワークフローをApply to eachを使う方法/使わない方法で作成して比較してみたいと思います。作成するのは、受信したメールの添付ファイルをOneDriveの指定フォルダに自動保存するワークフローです。

2-1. Apply to eachアクションを使わない場合のワークフロー

 まずはApply to eachアクションを使わずにワークフローを作成してみます。

Apply to eachアクションを使わない場合のワークフロー

 Apply to eachアクションを使わない場合、ワークフロー全体図はこのような形になります。「ファイルの作成」アクションの「ファイル名」「コンテンツ」には、「新しいメールが届いたとき」のトリガーから得られる添付ファイルの情報を使うために、それぞれ以下の式(関数)を入力します。

・ファイル名:triggerBody()?['attachments']?[0]?['name']
・ファイル コンテンツ:triggerBody()?['attachments']?[0]?['contentBytes']

メールの添付ファイルを自動でOneDriveの指定フォルダに保存するワークフロー(添付ファイルが1つ、複数の場合)

 ただし、上で作成したワークフローには大きな問題があります。「受信したメール1通に1つの添付ファイル」であれば正常に動作するのですが、添付ファイルが2つ以上ある場合でも添付ファイルは1つしか処理されません。実行結果は「エラー」にはならないものの、期待する結果(すべての添付ファイルをOneDriveに保存する)のとおりには動きません。

※お詫びと訂正:掲載当初、複数の添付ファイルがある場合に「エラーが表示される」と説明していましたが、正しくは上述のとおりでした。お詫びのうえ訂正いたします。(2022/03/24 11:10 編集部)

ファイルの作成アクションを増やす(?)

 この問題は、ファイルの作成アクションをあらかじめ添付ファイルの数だけ用意すれば解決できるように思えます。しかし、添付ファイルの個数は事前にはわからないので、この解決策は現実的ではありません※注。つまり「受信したメールの添付ファイルの数に応じて」、添付ファイルの個数ぶんだけ処理を繰り返す仕組みが必要なのです。

※注:さらにファイルの作成アクションを複数個用意すると、今度は「添付ファイルが1個だけ」だった場合に処理がエラーとなる問題もあります。

2-2. Apply to eachアクションを使う場合のワークフロー

 次に、Apply to eachアクションを使ってワークフローを作成してみます。

Apply to eachアクションを使う場合のワークフロー

 Apply to eachアクションを使う場合のワークフロー全体図はこのような形になります。

 Apply to eachアクションの「以前の手順から出力を選択」という欄に「添付ファイル」と表示されています。これにより、アレイに格納されている要素(添付ファイル)の数だけ、Apply to eachの枠内に作成したワークフローが繰り返し実行されるので、添付ファイルが1つでも、2つ以上でもエラーとなりません。

「ファイル名」「ファイルコンテンツ」は動的なコンテンツから選ぶ

 先ほどの「2-1. 『Apply to each』コネクタを使わない場合のワークフロー」では、ファイル名とファイルコンテンツを式として(なかば強引に)入れる必要がありましたが、こちらでは「動的なコンテンツ」から簡単に入力できます。

 またファイルの作成アクションで、ファイル名に動的なコンテンツから「添付ファイル 名前」を入力すると、Apply to eachアクションが自動的に作成されて、その枠内にファイルの作成アクションが移動します。このように、前のステップからアレイが渡されるのでApply to eachを使って処理することが推奨される場合、Power Automateではユーザーが選択しなくても自動的にApply to eachが挿入されます。

3. Apply to eachアクションの並列処理

 Power AutomateのApply to eachアクションは、通常はアレイの値を1つずつ取り出して、順番に処理していく仕組みとなっています。ただし、これを並列処理に変更することもできます。1つずつ順に処理する必要がないワークフローでは、複数の値を同時に処理する並列処理のほうが早く済みます。

Apply to eachアクションのメニュー

 「Apply to each」アクションの右側にある「…」をクリックするとメニューが開くので、「設定」をクリックします。

並列処理(コンカレンシー制御)を有効にする

 「コンカレンシー制御」をオンにすると、「並列処理の次数」(一度に何個の処理を並列処理するか)を指定できます。オンにしたあとは、ワークフローがうまく動くかどうか、処理結果に不具合がないかどうかを確認しておきましょう。

4. 最後に

 今回はApply to eachアクションの仕組みを紹介してきました。どのように動作するのか、少しはイメージできたでしょうか? Apply to eachが用意されていることで、Power Automate/Azure Logic Appsは複雑な処理のワークフローを簡単に作成できるようになっています。

 前述したとおり、Power Automateではワークフロー内でアレイ(アレイとして定義されている動的なコンテンツを含む)を指定すると、Apply to eachアクションが自動的に挿入されます。したがって、多くの人はあまり意識せずにこれを使っているかもしれません。ただし、処理によってはApply to eachが不要な場面もあります※注。その場合はApply to eachで行われている処理を理解したうえで、関数を利用するなとワークフローの見直しや修正をすることをオススメします。

※注:たとえばアレイに含まれる値が1つだけの場合でも、処理に使う変数がアレイ型であれば、Power Automateは自動的にApply to eachを挿入してしまいます。今回の検証方法をアドバイスしてくださったMicrosoft MVPのHiroさんが、ご自身のブログでこれを回避する方法を紹介されていますので参考にしてください。
●参考ブログ「MoreBeerMorePower」:first関数で不要なApply to eachを回避する

カテゴリートップへ

この連載の記事