こんにちは!開発エンジニアの藤原です。私事ですが名字が松田から藤原に変わりました。
そんなことはさておき、前回の投稿から少し空きましたが今回も小技のご紹介です。
PowerAppsにて、PowerAutomateの完了を待機させたい
今回の内容について知りたい!という方は、既にPowerPlatformの初歩的な使い方はマスターしているものと考えて本稿を執筆してまいりますことをご容赦ください。
キーワード検索でこの記事にたどり着いた方の中には、次のようなことで困ってる人も多いのではないでしょうか?
PowerAppsから呼び出したフローが完了するまでPowerAppsの処理を止めたい。
私も今の案件でこの内容にぶち当たり、頭をかかえた時期がありました。
基本的にPowerAutomateは別の何かをトリガーに動き始めるもので、PowerAutomate自身が何かのトリガーになることはできない一方通行のものである。と思っていたからです。
いろいろと調査&試行錯誤していった結果、PowerAutomateのとあるアクションで解決することができました。
「PowerAppsまたはflowに応答を返す」アクション
こちらのアクションなのですが、何をするものかというと「出力追加で設定した値を"戻り値"として呼び出し元に返す」ことができます。
おそらく本来の目的としてはPowerAppsで指定されたデータソース(SharePointリストやExcelファイルなど)から取得してきた値をPowerAppsに持っていくことなのではないかと思いますが、今回はこれを使ってPowerAppsに待機させます。
フローが終わったら戻り値を返す、という処理を実現するためにこのアクションは一番最後のステップに追加しましょう。
画像の通り、大きく6種類のデータ型を返すことができるのですが「数」だとPowerApps側のIf文でデータ型が一致しないエラーが回避できなかったのでテキスト型を使うことにします。
このような感じで「CompleteFlg」という変数に「True」という値を文字列でセット。
PowerAutomate側の設定は以上になるので、次はPowerApps側で戻り値の受け取るコードを記述します。
今回は「フォームから何かが登録されたら動く」という前提でForm.OnSuccessプロパティに記述するものとします。
//まずフローを呼び出す一般的な構文
Flow名.Run("フローに渡す値");
//上記の構文を元に、次は戻り値を受け取る構文
Set(varReturnTxt,
Flow名.Run("フローに渡す値").completeflg
);
Javaに精通している方であれば「Getterを呼び出すときに似ている」と感じるかもしれません。
「varReturnTxt」という変数を定義して、その中にフローを呼び出したことで返ってきた値を格納しています。
このコードが実行された場合「varReturnTxt」には「True」という文字列が入ってきます。
この時点でもう「PowerAppsに待機させる」という目的は達成されているのですが、それがどういうことなのかもう少し詳しく解説します。
Set(varReturnTxt,
Flow名.Run("フローに渡す値").completeflg
);
Navigate(Top):
このように、戻り値を受け取るコードのあとに別のコードを書いたとします。
そうするとこのNavigate関数はどのタイミングで動き出すのかというと、varReturnTxtにTrueが格納された後になります。
PowerAppsは基本的にセミコロンで区切られた複数行のコードは上から順に実行されていくからです。
実際にこの状態でフォーム登録を行うと、登録ボタンを押してから1~2秒ほど読み込み状態が続いた後にNavigateによる画面遷移が行われます。この1~2秒というのが、裏でフローが動いて完了するまでの時間です。
そしてNavigate先のTop画面.OnVisibleプロパティに「varReturnTxtの中身がTrueであるか否か」という内容のIf文を記述することで、フローの実行結果からの連続した処理を実現することができるのです。
If(varReturnTxt = "True", //フロー実行後だったら
Refresh(List); //リストを更新する
Set(varReturnTxt, "false"); //処理実行後にフラグをオフに戻す
) //評価結果がfalseのときは何もせずIf文を抜ける
この方法はあくまでPowerAppsから呼び出したフローからの応答を待機している状態なので、例えば自動化されたフローなどをトリガーにPowerAppsを動かすことはできません。
ですが今回の発見に至るまで私はPowerAutomateからの応答を待機できるということも知らなかったので、今後の開発において大きな前進となりました。
個人的にこの動きが実装できるかどうかは、PowerApps開発者としての初級から中級への壁のように感じています。
本稿が皆様の開発に少しでもお役に建てたなら幸いです。