業務でPower Apps開発をしていると、標準関数を利用したループ処理以外のループ処理を要求される場合が少なからずあると思います。
今回はそんな場合に利用できるタイマーコントロールでの代用例を紹介したいと思います。
ターゲットユーザー:開発者
ループ処理のための関数
通常のタイマーの使用方法
Waitタイマーとして利用する。
- Startプロパティにトリガーとなる条件を記述する。(必ずBoolean値となる式または変数とする)
- OnTimerEndアクションで次に実行したい処理を記述する。
タイマーで使用する主要なプロパティ
プロパティ名 | プロパティの型 | 動作等 | 属性 |
---|---|---|---|
Duration | Number | タイマーが作動する時間(ミリ秒:MAX ∞) | 設定値 |
Start | Bool | trueでタイマーをスタートさせる | 設定値 |
OnSelect | 式 | 選択時に実行する動作を指定できる | アクション |
OnTimerStart | 式 | タイマーがスタートしたときの動作を指定できる | アクション |
OnTimerEnd | 式 | タイマーがDurationに達したときの動作を指定できる | アクション |
ループ処理に利用した際のメリット・デメリット
メリット
ForAll 関数内では使えないSet 関数やUpdateContext 関数が使える
デメリット
再度タイマーを起動する際リクエストが発生するため処理速度が極端に遅い
ループの実現法
Power Appsのタイマーコントロールは基本的にStartプロパティが”true”になることで起動します。1
再起動させるためには、Startプロパティを一度”false”に設定する必要があります。
OnTimerStartプロパティ、またはOnTimerEndプロパティの冒頭にStartプロパティを”false”に設定するよう記述することで、再起動の準備が整います。
コントロール | プロパティ | 値・式 | 動作 |
---|---|---|---|
画面 | OnVisible | Set(varIsTimerStart, false) | タイマーのスターターを初期化(待機状態) |
ボタン | OnSelect | Set(varIsTimerStart, true) | タイマーをスタート |
タイマー | OnTimerStart | Set(varIsTimerStart, false) | タイマーのスターターを初期化(再起動の待機) |
コントロール | プロパティ | 値・式 | 動作 |
---|---|---|---|
画面 | OnVisible | Set(varIsTimerStart, false) | タイマーのスターターを初期化(待機状態) |
ボタン | OnSelect | Set(varIsTimerStart, true) | タイマーをスタート |
タイマー | OnTimerEnd | Set(varIsTimerStart, false) | タイマーのスターターを初期化(再起動の待機) |
上記いずれかの設定でタイマーは再起動可能な状態になります。
画面・ボタンは他のコントロールの処理結果でも結果が”true”または”false”になる式であれば置き換えることが可能です。
前述の設定を行ったうえで、OnTimerStartプロパティ、またはOnTimerEndプロパティ内で処理を実行し、実行結果の条件を満たしていなければStartプロパティを”true”に設定することで再起動が可能です。
ここで注意が必要なのは、必ず終了する条件を定義しておくことです。
例えばLoopCounterのようなものを設定し、上限に達したら再起動させないという措置もいいですし、もう一つタイマーを設置し、Valueが上限値に達したら再起動させないという処理もありでしょう。後者の場合には異なるタイマーをコントロールする変数の設定が必要になりますので、少々敷居の高い処理にはなります。
実用例
- SharePoint リストへのPatchの確実な実行
- Power Automateを使ったSharePointリストアイテムの一括取得(委任問題回避)
- Microsoft Graph APIでのSharePoint リストアイテムの一括取得(後日掲載予定)
Patchの確実な実行
OnTimerEndアクション内でIfError 関数を使用してエラーである場合は自身を再起動するよう記述すれば更新成功するまでLoopすることが可能です。但し、他のユーザーが更新を行っていた場合の対策を行わないと致命的なエラーとなりうるので注意が必要です。
まとめ
今回はざっくりとタイマーをLooPとして代用する方法を紹介しました。
今回紹介した他にも、Resetプロパティを利用した再起動法も有ります。
注意すべき点はタイマーコントロールが自身を再起動する際に、サーバーに対してリクエストが発生するという点です。単純に加算などを行いたい場合はForAll + Sequenceを利用することをお勧めします。
- AutoStartプロパティをtrueに設定することでForcus時に起動させることが可能です。 ↩︎