この記事はOffice 365 Advent Calendar 2019 (12/13)に参加しています。
予定では承認ワークフローのお話でしたが、内容が薄くなりそうだったので差し替え。
今日は13日の金曜日!
JSONをよく使う Microsoft Flow 改め Power Automate のお話です。
Power AutomateからPower Appsへテーブルを送る時にも使えます。
2019/12/16 16:30 追記
アクションの「設定」から改ページを弄って全件取得する方法を書き忘れていたので追記しました。
#データ取得数制限
Power AutomateでExcelテーブルやSharePointリストからまとまったデータを取得したい!
データが多い場合、まず失敗します。
コネクタは、物によって一度に取得できるデータ数に制限があるからです。
例えばExcel Online (Business)コネクタのアクション表内に存在する行を一覧表示は、一度に256行までしか取得できません。
(2019/12/13現在)
そしてSharePointコネクタのリストを読み出すアクション複数の項目の取得は、一度に1000アイテムが制限値です。
(2019/12/13現在)
#Do until
それらを解決するのがDo untilです。
Do untilは設定した条件がtrue
になるまで処理を繰り返し実行します。
これを利用してExcelであれば256行、SharePointであれば1000アイテムずつ取得する処理を繰り返し、全件取得します。
#前置き
この記事はExcelテーブルを表内に存在する行を一覧表示で取得する前提で話を進めます。
必要に応じて表内に存在する行を一覧表示を任意のアクションへ、Excelの制限値256
を任意の値に置き換えて読んで下さい。
#実装
##下準備
まず変数を三つ初期化します。
名前 | 種類 | 初期値 |
---|---|---|
LoopCount | 整数 | 0 |
DataEmpty | ブール値 | false |
JoinArray | アレイ | Blank |
##Do untilの設定
組込みの制御からDo untilをフローに追加します。
値の選択には変数DataEmpty
を設定。
これで**DataEmpty=true
になるまで処理を繰り返します。**
###Excelテーブルの読み出し
Do untilにはまずアクション表内に存在する行を一覧表示を追加します。
詳細オプションを表示し、スキップ数が256*変数LoopCount
となるように設定します。
構文は以下の通り。
mul(256,variables('LoopCount'))
変数LoopCount
の初期値は0のため、初回のDo until実行では256*0
で0行がスキップされます。
###Excelテーブルを全て取得済みか判定
次にアクション表内に存在する行を一覧表示の応答が空(empty)かどうかを判定します。
empty=true
であれば全ての行を取得したのでDo untilを終了させる処理を行います。
empty=false
であればDo untilを繰り返すための前処理を行います。
値の選択には以下の構文を入れ、true
に等しいか判定させます。
empty(body('表内に存在する行を一覧表示')?['value'])
body('表内に存在する行を一覧表示')?['value']
がアクション表内に存在する行を一覧表示の応答なので、empty 関数を使う事で空かどうか判定しています。
####empty=trueの場合
変数DataEmpty
をtrue
に設定します。
#####Do untilの終了
empty=trueの場合、ここでDo untilが繰り返します。
そして繰り返し条件DataEmpty=true
が満たされているので、Do untilが終了します。
####empty=falseの場合
empty=falseの場合、Do untilを繰り返す前に以下の処理を行います。
- 変数
LoopCount
を+1
- 変数
JoinArray
の処理-
初回
- 変数
JoinArray
にアクション表内に存在する行を一覧表示の応答からvalue
を格納する
- 変数
-
2回目以降
- 変数
JoinArray
と表内に存在する行を一覧表示のvalue
をUnion 関数で結合し、改めてJoinArray
に格納する
- 変数
-
初回
#####変数LoopCountを+1する
まず変数LoopCount
を+1
します。
これで**Excelテーブルの読み出しで設定したスキップ数が変動し、取得済みの行が自動でスキップされます。**
#####変数JoinArrayに取得したテーブルを格納する
初回と2回目以降では処理が異なるので条件を設定します。
値の選択に入っている式は以下の構文です。
empty(variables('JoinArray'))
変数JoinArray
は初期値が空白(Blank)なので、初回は必ずtrue
を返します。
######trueの場合
変数JoinArray
にアクション表内に存在する行を一覧表示からvalue
を格納します。
ここでDo untilが繰り返します。
######falseの場合
変数JoinArray
と表内に存在する行を一覧表示のvalue
を**Union 関数で結合します。**
入力に入れる構文は以下の通り。
union(variables('JoinArray'),body('表内に存在する行を一覧表示')?['value'])
これで変数JoinArray
に格納済みのテーブルと、今回の繰り返しで取得した256行が結合されました。
最後にアクション作成
の出力を変数JoinArray
に格納します。
ここでDo untilが繰り返します。
##変数JoinArrayをアクション作成でラップする
無事Do untilが終了したら、アクション作成
で変数JoinArray
をラップします。
これは変数のままだと他のアクションに渡せない場合があるので、その対策として行っています。
これで無事、データ取得数制限を回避してExcelテーブルを全件取得出来ました。
取得したExcelテーブルは配列になっているので下記のように好きに使っちゃいましょう。
- 他のコネクタにそのまま渡す
- Apply to each でSharePointに登録する
- 標準コネクタのみで、Power AutomateからPower Appsにテーブルを送信する
#おまけ:「設定」から改ページをONにして、しきい値を大きく設定してデータ全件取得する
アクションの「設定」から改ページをONにして、しきい値を大きく設定してもデータ全件取得できます。
但しこの方法はDo untilを使う方法に比べ、実行時間が倍近く長くなります。
参考に実行時間の比較を載せておきます。
- 読み込んだExcelテーブル
- 3059行
- 39列
どちらが良いか、用途に合わせて選んでください。
#まとめ
-
一度に取れないなら繰り返せばいい
- 結果が同じなら手段は一つではありません
-
変数をうまく使おう
- Power Automateを便利に使うなら絶対に避けて通れません
-
場合に応じて関数を使おう
- Azure Logic Appsに関数のリファレンスがあるので、それを読んで勉強しよう
- Azure Logic Apps および Power Automate の式で関数を使用するためのリファレンス ガイド
-
JSONにもっと馴染もう
- JSON完全に理解した
申し訳程度のJSON要素 - 縄神様こと小尾さんが、Power Automate 上での JSON 値の扱い方に関して色々解説してくれてます
- JSON Value into Power Automate
- JSON完全に理解した
Power Automateに限らず、「自分のしたい事を実現するにはどういうデータが必要か」を意識できれば自然と手段は見えてきます。
見えたらTry and Error を繰り返し、自身の知識とスキルをブラッシュアップしていきましょう。
来年も皆さんが充実したOffice 365 Lifeを送れますように。
No Data, No Life.