みなさんこんにちは!開発エンジニアの松田です。
本日、アプリ開発中にPowerAppsの特性とParamの罠にまんまと嵌ってしまい少しの間頭を抱えていました。。
今回はこのPowerAppsにおけるParamの罠について「みんなも気をつけよう!」という主旨でお届けしたいと思います。
PowerAppsとは?URLパラメータって?
PowerAppsで作るアプリというのは、そのほとんどがワークフローアプリになります。社員が経費や残業、物品の使用についてなどの申請を行い、その申請データをデータベースに保存して責任者が承認をするまでが一般的な流れです。
責任者が新しい申請がきたことに気付くためにはメール通知を使います。このときメールに申請データのリンクを貼っておくのですが、アプリ上で直接申請データを開くためにURLパラメータを使用します。
設定の仕方は簡単でアクセスしたいページのURLの末尾に「&hogehoge=fugafuga」のように、キーと値を付け足すだけで良いです。
今回のようなPowerApps上でデータに直接アクセスしたい場合などは…
アプリのURL + "&id=" + 申請データのID
とセットしてあげれば準備完了です。
PowerApps上でのURLパラメータの使い方
上記で準備したURLでアプリにアクセスしても、そのままでは普段と何ら変わらないトップ画面が立ち上がります。
今回URLパラメータを設定した目的は「申請データの編集画面に直接飛ぶ」なので、まずはアプリのStartScreenに次のコードをセットしましょう。
If(IsBlank(Param("id")), //URLパラメータ(id)が空だったら
TopPage, //トップ画面を表示
Form //そうでなければフォーム画面を表示
);
これで通常起動のときはTop画面、パラメータを持つURLから飛んできたときはForm画面からアプリをスタートさせることができます。
そしてパラメータを持っている場合は目的の申請データを特定して呼び出す必要があるので次の2つのコードを使います。
//①申請データを特定するためのキーを取得
If(IsBlank(Param"(id")) = false, //URLパラメータ(id)に何か入っていれば
Set(varParamId,
Value(Param("id")) //変数にURLパラメータ(id)の中身を格納(今回の場合は申請データのIDが入ります)
)
);
//②目的の申請データをフォームに表示
If(IsBlank(varParamId), //varParamIdが空だったら
Gallery.Selected, //ギャラリーで選択されたデータを表示
LookUp(SharePointリスト名, //そうでなければSharePointリストの中からLookUpで
ID = varParamId //Paramに格納されていたIDをキーに申請データを抽出
)
);
使う場所(動かすタイミング)
今回、私が嵌った罠というのがこのポイントになります。
②のコードについてはForm画面にあるForm1のitemsプロパティにセットするだけなので簡単なのですが、①をセットする場所がかなり重要になってきます。
①をセットするとき、まず考えられる場所が2つあります。
1つ目はアプリのOnStart。アプリの起動時に1回だけ動きます。
2つ目はForm画面のOnVisible。Form画面が表示されるたびに何度も動きます。
PowerAppsはMicrosoftのアップデートによって頻繁に仕様が変わります。その中でもOnStartまわりは「以前はNavigateが使えたのに使えなくなった」など、既存のアプリに大きな影響を与えるような変更がなされることがありました。
さらにOnStartにあまり多くのコードを書いてしまうと、処理が追いつかなくなりOnVisibleに処理を追い越される可能性があるという点にも注意が必要です。
なので私の今いる現場では「なるべくOnStartではなくOnVisibleに初期化処理などを入れよう」という方針が提唱されています。
これに従って私は①のコードをOnVisibleに入れていたので、Form画面に遷移するたびに①のコードが実行されることになりました。
PowerAppsの特性
OnStartでもOnVisbleでも初期化される回数が変わる(ちょっと重くなる)だけじゃない?
と思うかもしれませんが、ここで効いてくるのがPowerAppsの「アプリ内で別の画面に遷移してもURLが変わらない」という特性です。
URLが変わらないということは、ずっとURLパラメータを持った状態になってしまいます。
この状態でOnVisibleに①を書いていると「別の申請データの編集ボタンを押したのに①で取得した申請データにしかアクセスできない」という罠に嵌ってしまうのです。
厳密に言うと、一瞬だけ別の申請データが表示されたあとキー取得処理が走ることで強制的にURLパラメータと一致する申請データが呼び出されるという感じです。
解決策
最初、この問題を解決する方法として浮かんだのがLaunch関数を使うことでした。
Launch("アプリのURL", "id", Blank()); //"&id=~" にブランクをセット
最初に開いたForm画面から別画面へ遷移するタイミングでこのコードを使って、URLパラメータを空にしてしまえばいいのでは?と。
結果として同じ申請データにしかアクセスできないという問題は解決できたのですが、URLが変わらないPowerAppsでURLを変更しているので新規タブで起動されてしまう仕様になってしまいました。
これはユーザー的にも使いにくく感じてしまうでしょう。
いろいろ考えてみましたが、URLが変わらない=URLパラメータを持ち続ける以上はどうしようもないので素直にOnStartに①を組み込むことにしました。
これくらいの処理ならOnStartに書いても問題ないでしょうし、変数をセットしているだけなのでアップデートで使えなくなることも考えにくいと思います。
1回だけParamの中身をvarParamIdという変数に格納して、Form画面から移動するタイミングでvarParamIdを空にする。この方法がベストだと思いました。
最後に
以上、本日松田が嵌ったホットな話題「PowerAppsとURLパラメータの罠」でした。
Paramを扱う際は通常起動とは違った挙動をするため、このような特殊な不具合に見舞われることが多いです。
皆様もParam関係で詰まった際はOnStart(初回のみ処理)とOnVisible(何度も処理)の違いに着目してみると解決できるかもしれません。