Power Apps タイマーを利用したループ処理①

Power Apps
Power Apps タイマーを利用したループ処理

業務でPower Apps開発をしていると、標準関数を利用したループ処理以外のループ処理を要求される場合が少なからずあると思います。
今回はそんな場合に利用できるタイマーコントロールでの代用例を紹介したいと思います。


ターゲットユーザー:開発者

ループ処理のための関数

通常のタイマーの使用方法

Waitタイマーとして利用する。

  1. Startプロパティにトリガーとなる条件を記述する。(必ずBoolean値となる式または変数とする)
  2. OnTimerEndアクションで次に実行したい処理を記述する。

タイマーで使用する主要なプロパティ

プロパティ名プロパティの型動作等属性
DurationNumberタイマーが作動する時間(ミリ秒:MAX ∞)設定値
StartBooltrueでタイマーをスタートさせる設定値
OnSelect選択時に実行する動作を指定できるアクション
OnTimerStartタイマーがスタートしたときの動作を指定できるアクション
OnTimerEndタイマーがDurationに達したときの動作を指定できるアクション
タイマーの主要なプロパティ

ループ処理に利用した際のメリット・デメリット

メリット

ForAll 関数内では使えないSet 関数UpdateContext 関数が使える

デメリット

再度タイマーを起動する際リクエストが発生するため処理速度が極端に遅い

ループの実現法

Power Appsのタイマーコントロールは基本的にStartプロパティが”true”になることで起動します。1
再起動させるためには、Startプロパティを一度”false”に設定する必要があります。

OnTimerStartプロパティ、またはOnTimerEndプロパティの冒頭にStartプロパティを”false”に設定するよう記述することで、再起動の準備が整います。

コントロールプロパティ値・式動作
画面OnVisibleSet(varIsTimerStart, false)タイマーのスターターを初期化(待機状態)
ボタンOnSelectSet(varIsTimerStart, true)タイマーをスタート
タイマーOnTimerStartSet(varIsTimerStart, false)タイマーのスターターを初期化(再起動の待機)
OnTimerStartで再起動準備を行う場合(例)
コントロールプロパティ値・式動作
画面OnVisibleSet(varIsTimerStart, false)タイマーのスターターを初期化(待機状態)
ボタンOnSelectSet(varIsTimerStart, true)タイマーをスタート
タイマーOnTimerEndSet(varIsTimerStart, false)タイマーのスターターを初期化(再起動の待機)
OnTimerEndで再起動準備を行う場合(例)

上記いずれかの設定でタイマーは再起動可能な状態になります。
画面・ボタンは他のコントロールの処理結果でも結果が”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を利用することをお勧めします。

  1. AutoStartプロパティをtrueに設定することでForcus時に起動させることが可能です。 ↩︎

この記事を書いた人

岩本敏彦
この投稿者の最近の記事
タイトルとURLをコピーしました