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

Power Apps
この記事は約5分で読めます。

前回はタイマーコントロールのStartプロパティをオン・オフする形でのループ代用例を紹介しました。
今回はRepeatプロパティを使った代用例をサンプルコードを交えて解説していきたいと思います。


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

Startプロパティでのループ

基本のループ設定

/*
    Screen(対象のタイマーが設置されている任意の画面)
*/
OnVisible =Set(_TimerController, false);

/*
    Timer
*/
Duretion =0    // 任意の時間でOK
Start =_TimerController
OnTimerEnd |
    =Set(_TimerController, false);  / 一度タイマーを止める
    If(
        Not(終了条件),
        Set(_TimerController, true);,  // 継続するので再起動
        継続時の処理
    )

/*
    タイマー起動例
*/
Button.OnSelect =Set(_TimerController, true);
// または任意のコントロールで
Set(_TimerController, [Bool値になる判定式]);   // 判定式がtrueの場合終了次第即時にループが開始します。

上記を任意の画面及びタイマーに設定し、ボタンや前工程の実行結果で”varTimerControler”を[true]に変更することでループが開始されます。

Repeatプロパティでのループ

Repeatプロパティはtrueの間TimerOnStart → Duration → OnTimerEndを繰り返します。
つまりWhileループ同様に利用できます。

あまりよくない利用例

/*
    Screen(任意の画面)
*/
OnVisible =Set(_TimerController, false);

/*
    Timer
*/
Duretion =0    // 0にすることで即時ループできる
Repeat =_TimerController
OnTimerEnd =継続中の処理

/*
    タイマー活用例(Power Automate Flowの戻り値を待つ)
*/
Button.OnSelect |
    =Set(_TimerController, true);
    Set(_TimerController, IsError( LogicFlow.Run() ))  // フローが正常終了したらリピートしない
    //  LogicFlowは任意のフロー名

例に挙げたPower Automate Flowの結果を待つループには欠点があります。
Duration =0の場合、結果が返ってくるまで5秒かかったとすると…
5 * 1000 = 5000 回のTimerOnStart&TimerOnEndが実行されてしまいます。
例えば結果が返ってくるまでの間Notify()で結果待ちを通知するような場合5000回実行されてしまいアプリがエラー終了する可能性が出てきます。
逆にDurationを長くしすぎても遅延が大きくなりパフォーマンス低下になります。

また、フローの戻り値を受け取る変数がないうえにフローが異常終了した場合ループが終了しません。

Repeatを利用する場合は条件式で実行させるなど工夫をするか、ボタンでスタート・ストップを制御できるよう対策を講じる必要があります。

※Startプロパティを利用する場合でも緊急時に中断できる対策は必要です。

改善例

/*
    Screen(任意の画面)
*/
OnVisible |
    =Set(_TimerController, false);  // タイマー制御用変数

/*
    Timer
*/
Duretion =10000    // フローを条件を変え複数回テスト実行した平均実行時間を設定
Repeat =_TimerController
OnTimerStart =Set(_SEQ, _SEQ + 1);  // ループ回数を増やす
OnTimerEnd |
    =If(
        And(Not(_TimerController), _SEQ <= 2),
        ループから抜けたときの処理;
        ,

        _SEQ > 2,
        Set(_TimerController, false);  // ループが5回以上で強制終了
        フローが不正終了した場合の処理;
    )

/*
    タイマー活用例(Power Automate Flowの戻り値を待つ)
*/
Button.OnSelect |
    =Set(_TimerController, true);
    Set(_SEQ, 0);  // ループ回数を記憶するための変数
    Set(_FlowReturn, LogicFlow.Run());
    Set(_TimerController, IsError( _FlowReturn ))  // フローが正常終了したらリピートしない
    //  LogicFlowは任意のフロー名、フローはエラーを返す
  • Durationをフローの平均実行時間に設定することでループ間のインターバルを最適にしました。
  • OnTimerEndで実行条件を設定することで無駄な処理を制限しました。
  • 万が一フローが実行されなかった、又はフローが異常終了した場合に備えループ実行回数をカウントし、上限に達した場合は強制終了されるようにしました。

まとめ

今回はStart,Repeatプロパティの設定例を紹介しました。
勘のいい方はもう気づかれていると思いますが、タイマーを利用することでSet関数が利用できるようになります。
ループ中に条件に応じてSet関数を使う事で変数に値を保持したままの条件分岐が可能になります。
条件に応じてボタンを選択したり、他のタイマーを起動したりできます。
ForAll関数でも条件分岐は可能ですが、変数を保持することはとても難しくなります。

タイマーを利用することでパフォーマンスは落ちますが既存のループ用関数とは異なる使い方ができますので、積極的に取り入れてもいいと思います。
もちろん不必要なタイマーループはパフォーマンスを低下させるだけですので、避けるべきです。

この記事を書いた人

岩本敏彦

コメント

タイトルとURLをコピーしました