- プログラミングは分からないけど自動化したい
- PowerAutomateの使い方がイマイチ分からない
- Apply to eachを使い方を知りたい
無料ツールでさらにノンプログラミングで自動化ができるならぜひやってみたい!
この記事では、そんな方に向けてApply to eachの使い方を3ステップで説明します。
- 基本:配列の扱い/Apply to eachの使い方
- 応用:高速化/ループを抜ける
- ヒント:勝手にApply to eachになる/繰り返し上限/タイムアウト時間
この記事を読めば、Apply to eachが使えるようになります。
【基本①】配列の扱い
配列からデータを取り出す方法は2つあります。
- 要素番号を指定して1つ取り出す
- Apply to eachで全部取り出す
要素番号を指定して1つ取り出す
Apply to eachを使う前に、配列からデータを取り出す方法を確認します。
知っているという方は読み飛ばしてください。
例えばこんな配列があります。
[ "あ", "い", "う", "え", "お" ]
アクション「変数を初期化する」の値に入力します。
配列のデータを取り出す式はこちら
variables('配列名')?[数字]
後ろに?[数字]を付けると好きな位置のデータを取り出せます。
例えば「う」を取り出す式はこうなります。
variables('ひらがな')?[2]
要素番号は0から始まるので「う」は2です。
- あ=0
- い=1
- う=2
- え=3
- お=4
この式を作成の入力に入れてみます。
アクション データ操作の「作成」を作り、式に入力します。
テストでフローを動かすと「う」が表示されました。
名前の付いた配列はコレクション
説明を分かりやすくするために単純な配列を使いましたが、実際のPowerAutomateでは名前の付いた配列(=コレクション)がよく出てきます。
先ほどの配列で「あ」だった部分に「ローマ字:a」「ひらがな:あ」と2つ情報が入っています。これがコレクションです。
[ { "ローマ字": "a", "ひらがな": "あ" }, { "ローマ字": "i", "ひらがな": "い" }, { "ローマ字": "u", "ひらがな": "う" }, { "ローマ字": "e", "ひらがな": "え" }, { "ローマ字": "o", "ひらがな": "お" } ]
アクション「変数を初期化する」の値に貼り付けます。
コレクションのデータを取り出す式
variables('コレクション名')?[数字]?['キーの名前']
「う」を取り出す式はこうなります。
variables('文字')?[2]?['ひらがな']
アクション データ操作の「作成」を作り、式に入力します。
今回は例で「あ~お」の配列を使ったので「う」の要素番号が「2」だと分かりましたが、普通は何番目か分かりません。
また、「あ~お」全部取り出したい場合は何度も式を書く必要があります。
ここでApply to eachが登場します。
【基本②】Apply to eachで全部取り出す
配列から全てのデータを取り出す方法を試します。
Apply to eachは2つの手順で使います。
- 配列を選ぶ
- 現在のアイテムを選ぶ
この方法は要素番号をしていしないので慣れると簡単になります。
実際に動かしてみましょう。
配列の場合
テスト用の配列(アレイ)を作成します。
アクション「Apply to each」を選んで、「配列」を選択、
アクション データ操作の「作成」で「現在のアイテム」を選んだところです。
フローを実行した結果です。
「作成」の1/5に「あ」が入りました。
5回繰り返されて、「あ~お」が出力されました。
1/5 ・・あ
2/5 ・・い
3/5 ・・う
4/5 ・・え
5/5 ・・お
これがApply to eachの動きです。
ちなみに「現在のアイテム」の式はこうなっています。繰り返し回数によって中身が「あ~お」に変化します。
items('Apply_to_each')
コレクションの場合
PowerAutomateでよく使うコレクションでも試してみます。
アクション「変数を初期化する」でコレクションを作成します。
アクション「Apply to each」を選んで、「配列」を選択、
アクション データ操作の「作成」で「現在のアイテム」を選びます。
コレクションだとキーの名前と値がセットになってしまいます。
値だけ取り出したい場合は、「現在のアイテム」の後ろに「キーの名前」を追加して指定します。
items('Apply_to_each')?['ローマ字']
ローマ字だけ取得する為に、場合は「現在のアイテム」を修正します。
フローを動かすと「ローマ字」だけが表示されました。
2つの値を同時に取得したい場合は2つめを入力します。
式が2つ並びました。
フローを動かすと「aあ」のように2つの値が並んで表示されました。
【応用①】高速化する
PowerAutomateの繰り返し処理は一般的なプログラムより遅いです。
ですが、1つの設定で簡単に高速化できます。
これは100回の繰り返しを行った結果です。
- 高速化無し ・・120秒
- 高速化有り ・・6秒 20倍!
高速化にはコンカレンシー制御を有効にします。
Apply to eachの設定を開きます。
コンカレンシー制御という項目があります。これをONにして。完了を押します。
これだけで高速化は完了です。
3タイプの繰り返しを試した結果です。
- コンカレンシー制御無し ・・120秒
- コンカレンシー制御有り(並列処理20) ・・10秒
- コンカレンシー制御有り(並列処理50) ・・6秒
上の例では並列処理50の方が半分の時間で終わっていますが、処理内容によっていは並列20と並列50の差がほとんど無くなる場合もあります。
処理内容によっては高速化の性能もばらつきがでるようです。
【応用②】ループを抜ける
標準機能でApply to eachのループを抜けて次のアクションに移る方法はありませんが、回避策はあります。
回避策:Do Untilに切り替える
Do UntilはApply to eachと同じ繰り返しができます。
Apply to eachは全ての値を処理しなければ終了しませんが、Do Untilの場合は終了条件を自分で設定できます。
Do Untilでループを抜ける方法を試してみます。
こちらの5つ要素がある配列を繰り返し処理してみます。
[ "a", "b", "c", "d", "e" ]
データ操作の「作成」を追加 ※名前を「配列」に変えておきます。
こちらを入力
[ "a", "b", "c", "d", "e" ]
変数の「変数を初期化する」を追加
名前:カウンタ
種類:整数
値 :空
コントロールの「Do until」を追加
左:length(outputs(‘配列’))
中:次の値に等しい
右:variables(‘カウンタ’)
この条件だと左は[a,b,c,d,e]の要素数5固定です。右のカウンタは1回ループごとに12345..と増えます。
なので5回ループしたら終わる処理という意味です。
データ操作の「作成」を追加
outputs(‘配列’)?[variables(‘カウンタ’)]
ここへループ1回ごとにa,b,c,d,eと表示されます。
変数の「変数の値を増やす」を追加
名前:カウンタ
値 :1
1ループごとに数字を増やすために最後に数を1追加します。
この処理を忘れると永遠にループします。(実際は初期上限値の60回で止まります)
フローを動かし5回ループが確認できました。
5/5は「e」になってますね。
例えばループ3回目の「c」で終了したい場合
「変数の値を増やす」の下に、コントロールの「条件」を追加します。
左:outputs(‘作成’)
中:次の値に等しい
右:c
「はいの場合」にはカウンタの値に終了条件を入れます。
変数の「変数の設定」を追加
名前:カウンタ
値 :length(outputs(‘配列’))
このlength(outputs(‘配列’))はDo untilの最初で指定した終了になる数字の5です。
ループ3回目の「c」まできたら数字を3から5に書き換えて無理やり終了させるという意味です。
Do untilのフロー全体はこんな感じになります。
再度動かすと3つめにある「c」でループが終了しました。
Do Untilは条件を追加すれば途中でループを抜けれる。
Apply to eachの代わりにになるので覚えておきましょう。
【ヒント①】勝手にApply to eachになる原因と回避策
勝手にApply to eachになる原因と回避策はこちら
- 原因①:動的なコンテンツに配列が含まれている
- 原因②:JSONが解析されている
※アクション「JSONの解析」を実行していなくても、ExcelやSharePointから取得したデータは自動で解析されます。 - 回避策:要素数を指定する
原因から確認していきます。
例えばここで動的なコンテンツにある「項目」を入れると・・
勝手にApply to eachが出てきます。
「別に繰り返したいわけじゃないのに。」と思うかもしれません。
勝手にApply to eachになる原因は2つ
- 原因①:動的なコンテンツに配列が含まれている
- 原因②:JSONが解析されている
※アクション「JSONの解析」を実行していなくても、ExcelやSharePointから取得したデータは自動で解析されます。
これが揃うと起こります。
Apply to eachが勝手に出てくる原因は、動的なコンテンツが配列だったからなんですね。
この動的なコンテンツを見ると[]が付いています。
[]は配列を表しています。
配列のデータは[“あ”,”い”,”う”,”え”,”お”]のように[]の中にカンマ( , )で区切ってデータを複数格納するものです。
例えばデータが1つしかない[“あ”]も[]が付いているので配列になります。これが勝手にApply to eachになる原因です。
ちなみに動的なコンテンツに「本文」がありますが、項目と同じデータです。
回避策:要素数を指定する
配列の1つめのデータだけでいい。と思っている方はこの式で対処できます。
first(配列)
first関数の中に配列の「本文」を指定します。
要素数を指定すればApply to eachは出てきません。
first関数で配列の1つめを指定したので、繰り返す必要が無いからです。
要素番号の指定でも同じ結果になります。
配列?[0]
1つ目のデータを示す[0]を指定していますが、取得したい要素番号が分かっている場合は任意の数字を指定しましょう。
【ヒント②】上限は10万回?
公式によると無償版は5000回、有償版は10万回が上限となっています。
低の場合は 5,000、それ以外の場合は 100,000
この制限は、”Apply to Each” ループが処理できる配列項目の最大数を表します。
クエリ アクションを使用して、大きい配列をフィルター処理できます。
https://docs.microsoft.com/ja-jp/power-automate/limits-and-config
無償版で実際に試した結果はこうなりました。
Apply to each 10万回
Do Until 5000回
Excel行の取得 10万行
無償版で実際に試してみると10万回も成功しました。
Do Untilは回数制限を5001にするとエラーになるので5000回が上限だとわかります。
Excelはしきい値が10万以下なので上限は10万でした。
ちなみに10万回だとループを回すだけで24分かかりました。
【ヒント③】10分でタイムアウトする理由
フローをテストして10分を超えるとこんなメッセージが表示されます。
公式によると、
10 分を超えて実行されるクラウド フローをテストすると、フローがバックグラウンドで実行され続けても Power Automate にタイムアウト メッセージが表示される場合があります。 この場合は、ビューを再度開いて現在の状態を取得してください。
https://docs.microsoft.com/ja-jp/power-automate/limits-and-config
という事なので、タイムアウトと表示されても実は動いています。
マイフローで見ると「テストの実行中」と表示され時間が[00:28:25]です。
待っていると成功しました。
テストで発生するタイムアウトのメッセージは無視しましょう。
まとめ
Apply to eachの使い方を3ステップで説明しました。
- 基本:配列の扱い/Apply to eachの使い方
- 応用:高速化/ループを抜ける
- ヒント:勝手にApply to eachになる/繰り返し上限/タイムアウト時間
ExcelのテーブルやSharePointのリストを扱うと繰り返し処理が増えてきます。初心者の方は基本を読んで繰り返しを試しましょう。慣れてきたら応用やヒントについても目を通して覚えておきましょう。フローが作りやすくなります。
PowerAutomateのおすすめ記事
人気ページ
Apply to eachの使い方
アレイのフィルター処理の使い方
日付関数の使い方
エラーを無視する方法
メールの内容をExcelへ転記
メール本文から名前を抽出
>>PowerAutomateの記事一覧を見る<<
お気に入り必須!公式ページ
Microsoft Power Automate
式関数のリファレンス
コネクタのリファレンス
Excel Online (Business)のリファレンス