【Power Apps】Param関数を使ってアプリ起動時の画面を制御する

こんにちは。日本マイクロソフトの向井です。
今回はParam関数の便利な使い方についてご紹介します。

（以前にも同じような内容で記事を書きましたが仕様変更＆不備がありましたので書き直したいと思います。）

# 0. 今回やりたいこと
Power Platformで申請アプリを作成しています。
申請者がキャンバスアプリから申請内容を入力すると、Power Automateによって承認者に承認依頼が届くシナリオで、承認者にアプリのリンクを送るとします。

その時に、申請一覧の画面（やホーム画面）ではなく、該当の申請内容の詳細が表示される画面が最初に表示されるようにしたいと思いませんか？
そんな時に役に立つのがParam関数です。

今回やりたいこととやり方を1枚のスライドで表すと以下のような感じです。
やり方について詳しくご説明していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/5d03db43-2715-95ab-ae15-0cde04f74668.png)
（今回実現したいことのイメージが湧かない方は本記事の第3章を先にご覧いただくとイメージが湧くかもしれません）

# 1. Param関数とは
詳しくは[Microsoft Docs](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-param#param) をご覧いただきたいですが、
**アプリのURLの後ろにパラメーターを付けることで、アプリにそのパラメーターを渡せる仕組みを作れる関数**だと思っていただければと思います。

*アプリのURL?パラメーター名=パラメーター*

というように使うことでアプリにパラメーターを渡せます。
（先ほどの画像の③の部分参照）

# 2. 実際に作ってみる
## 2.1. パラメーターを変数にセットする
アプリのURLの後ろについているパラメーターをアプリ内で使うためにSet関数を使って変数にセットします。
この時に、パラメーターがない場合のことを考慮します。

参考コード
*If(!IsBlank(Param("recordId")),Set(recordId,Param("recordId")))*
※recordIdがパラメーター名かつグローバル変数の名前
*!IsBlank* とすることで、空ではなかった場合=パラメーターがあった場合という条件になります。

これは**アプリを開始するときに読み込んでほしい設定なので、OnStart**のところに書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/6190d813-fc93-b13b-c6a6-ac723110211e.png)


## 2.2 パラメーターのありなしで最初に開く画面を制御する
アプリのURLの後ろにパラメーターがついている場合は「申請内容の詳細情報が表示される画面（詳細画面）」を、パラメーターがついてない場合は「申請一覧の画面」を最初に表示するように設定します。

参考コード
*If(IsBlank(Param("recordId")),BrowseScreen1,DetailScreen1)*
※BrowseScreen1は申請一覧の画面、DetailScreen1は申請内容の詳細画面

これは以前はOnStartのところに書いていましたが、**仕様が変わって、StartScreenのところに書くことになりました。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/be0c325d-37fd-07c3-da0e-506c7984a90b.png)


## 2.3 詳細フォームで表示するレコードを制御する
詳細ページが表示される場面は以下の2パターンあります。
①申請一覧ページからあるレコードが選択された時
②承認者が受け取ったリンクからアプリを開くとき

①の場合は、申請一覧で選択されたレコードを、
②の場合は、リンクの後ろについているパラメーターに応じたレコードを
フォームに表示する必要があります。

どのレコードを表示するかの制御は、フォームのItem欄で行うことができます。

参考コード
*If(IsBlank(recordId),BrowseGallery1.Selected,LookUp(リモートワーク申請,ID=Value(recordId))*

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/f8e4cc19-69d5-f8b5-afaa-2fd1faabf05a.png)

パラメーターがないときは、申請一覧で選択されたレコードを、
パラメーターがあるときはそのパラメーターに応じたレコードを表示させるように書いています。

## 2.4 パラメーター付きのアプリリンクを承認者に送る
アプリのリンクを送るのにはPower Automate を利用することができます。

今回はTeams アクションの「チャットまたはチャネルでメッセージを投稿する」を使用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/c65b9c16-db24-d787-d492-3f9a4172934b.png)

メッセージの部分はHTMLで書くこともできるので、アプリのリンクを送ることができます。
マスキングしていますが、アプリのリンクの後に
*?recordId=ID*
をつけて、一つのリンクとしています。
※IDは動的なコンテンツで、トリガーとなったレコードのIDを指定しています。

# 3. 動作確認
## 3.1 申請する
申請アプリから新しい申請をします。
今回のアプリでは申請一覧画面の右上の＋から新しい申請をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/c30926b7-2d32-b864-b6e4-c54b8d62e905.png)

申請画面です。
デモなので、申請者と承認者は同じです。
右上のチェックマークから申請完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/2cd64e74-e618-3e95-9f0c-a0f6b1a811d6.png)

## 3.2 承認する
Power Automateによって承認者のTeams に通知が届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/bb6e9092-65a7-4c7e-d64d-1fa776433d88.png)
詳細を確認を押します。

アプリが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/41b6492d-4440-543d-97fd-9095e5464cc0.png)

パラメーターを設定してあるので、該当の申請内容がすぐに確認できます。
アプリ内の承認ボタンを押して、承認完了です！

## 3.3 結果通知（おまけ）
承認されたら、申請者のTeamsに通知がいくようにもう一つフローを作っておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/082251fe-07fc-2088-974e-1ecb73f86cdd.png)
ここでもパラメーターを付けてます。

申請者にはこのようなメッセージが届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/949ed775-4cbf-2356-651d-89ff366a372c.png)

# まとめ
Param関数を使うとより使いやすいアプリを作ることができますので、ぜひチャレンジしてみてください！