松本典子の「はじめよう!Azure Logic Apps/Power Automateでノーコード/ローコード」 第12回
繰り返し処理のためのアクション、自動的にワークフローへ挿入されるのはなぜ?
Power Automateで「それぞれに適用する(Apply to each)」の仕組みと動作を理解しよう
2022年03月24日 08時00分更新
こんにちは、Microsoft MVP(Azure / Business Applications)の松本典子です。
本連載の前々回(第10回)、前回(第11回)では、ユーザーが送信した写真から文字を読み取るLINEボットをノーコードで作成する方法を紹介しました。このうち、前回のワークフロー作成編では「Apply to each」というアクションを利用しています。
※注:本記事掲載後、「Apply to each」アクションは、Power Automate上の一部表示で「それぞれに適用する」アクションという名前に変更されています。それに伴ってタイトルを変更しました。(2024/10/05 編集部)
前回はあまり詳しく説明しませんでしたが、実はPower Automateでワークフローを作成する際には、このApply to eachアクション※注を利用する場面が多くあります。また、ワークフローを作っているうちに自動的に挿入されることもあり、よく理解しないまま使っている方も多いかもしれません。
そこで今回は、前回作成したワークフローを振り返り、また動作検証用のワークフローも作成しながら、Apply to eachがどのような働きをするのか、どんな場面で使うのかについて説明していきます。
※注:なお、Azure Logic Appsで同様の動作をするのは「For each」アクションです。名前が違うので注意してください。
1. 「Apply to each」アクションとは
Apply to eachは、ワークフローの中でループ処理(繰り返し処理)を行うためのアクションです。組み込みコネクタの1つであるコントロールコネクタに含まれています。
ところで、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アクションで繰り返すようにして、受信したすべてのメッセージに対して読み取り処理を実行しているわけです。
2. 今回作成するワークフロー
Apply to eachアクションについての理解を深めるために、今回は同じワークフローをApply to eachを使う方法/使わない方法で作成して比較してみたいと思います。作成するのは、受信したメールの添付ファイルをOneDriveの指定フォルダに自動保存するワークフローです。
2-1. Apply to eachアクションを使わない場合のワークフロー
まずはApply to eachアクションを使わずにワークフローを作成してみます。
Apply to eachアクションを使わない場合、ワークフロー全体図はこのような形になります。「ファイルの作成」アクションの「ファイル名」「コンテンツ」には、「新しいメールが届いたとき」のトリガーから得られる添付ファイルの情報を使うために、それぞれ以下の式(関数)を入力します。
・ファイル名:triggerBody()?['attachments']?[0]?['name']
・ファイル コンテンツ:triggerBody()?['attachments']?[0]?['contentBytes']
ただし、上で作成したワークフローには大きな問題があります。「受信したメール1通に1つの添付ファイル」であれば正常に動作するのですが、添付ファイルが2つ以上ある場合でも添付ファイルは1つしか処理されません。実行結果は「エラー」にはならないものの、期待する結果(すべての添付ファイルをOneDriveに保存する)のとおりには動きません。
この問題は、ファイルの作成アクションをあらかじめ添付ファイルの数だけ用意すれば解決できるように思えます。しかし、添付ファイルの個数は事前にはわからないので、この解決策は現実的ではありません※注。つまり「受信したメールの添付ファイルの数に応じて」、添付ファイルの個数ぶんだけ処理を繰り返す仕組みが必要なのです。
※注:さらにファイルの作成アクションを複数個用意すると、今度は「添付ファイルが1個だけ」だった場合に処理がエラーとなる問題もあります。
2-2. 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」アクションの右側にある「…」をクリックするとメニューが開くので、「設定」をクリックします。
「コンカレンシー制御」をオンにすると、「並列処理の次数」(一度に何個の処理を並列処理するか)を指定できます。オンにしたあとは、ワークフローがうまく動くかどうか、処理結果に不具合がないかどうかを確認しておきましょう。
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を回避する
この連載の記事
-
第44回
Team Leaders
契約書を確実に期限管理! SharePoint+Power Automateで期日通知を自動化 -
第43回
Team Leaders
社内からの質問に自動回答! AI Builder+ノーコードでQ&Aボットを作ろう -
第42回
Team Leaders
Power Automateで複数人の承認(多段階承認)ワークフローを簡単作成しよう -
第41回
Team Leaders
重要なTeamsメッセージの見失い/見落としを防ぐPower Autometeのフローを作ろう -
第40回
Team Leaders
クラウドフローからデスクトップフローを「Picture-in-Picture」で起動する -
第39回
Team Leaders
面倒なカレンダー登録作業を生成AIで自動化するワークフローを作ろう -
第38回
Team Leaders
生成AIに日本語プロンプトで指示を出し、メールから情報を抽出してもらおう -
第37回
Team Leaders
フォルダー内のすべてのファイルを添付してメールを自動送信するフローを作ろう -
第36回
Team Leaders
ローカルPCのテキストファイルをPower Automateに読み込ませて活用しよう -
第35回
Team Leaders
受信メールの添付ファイルを種類に応じたフォルダに自動保存する -
第34回
Team Leaders
Power AutomateでTeamsのチーム全員にメンションを送る方法 - この連載の一覧へ