今回はPowerAppsでアプリを開発している過程(それをフォローしている過程)で遭遇した問題についてのトラブルシューティングです。
Background
- PowerAppsでアプリを構築している。
- 当該アプリはTeamsのチームのチャネル内のタブに埋め込み表示する。
- OutlookのメールやTeamsのメッセージ内のリンクから当該アプリに画面遷移する経路を用意する。
- 遷移の折、アプリで特定のデータ(IDで指し示される)を初期表示したい。
- 当該データはメールやメッセージによって異なる(データのIDは動的に決まる)。
Problem
PowerAppsのアプリをWebブラウザで表示するのであれば、URLのクエリ文字列の中に任意名称のパラメータを指定することができる(例:...&itemId=123
)。
しかしTeamsのチームのチャネルのタブ内にアプリを埋め込み表示している場合、当該タブを指すURL(「タブへのリンクをコピー」で取得)にクエリ文字列を追加しても効果がない。
「タブへのリンクをコピー」で取得できるURLはあくまでもそのタブを指すURLであって、タブの中に表示されるコンテンツについてのURLではない。
Solution
「タブへのリンクをコピー」で取得できるURLのクエリ文字列の中に含まれる context=...
にURLエンコードされたJSONの形式で情報を埋め込むことで解決できる。
URLのクエリ文字列部分をよく見ると、 context=...
というキーでもってJSON形式のデータが埋め込まれている(読みやすさのため?
と&
の前で改行を挿入している):
https://teams.microsoft.com/l/entity/a6b6....7af9/_djb2_msteams_prefix_3...
?context=%7B%22subEntityId%22%3Anull%2C%22channelId%22%3A%2219%3A...3e99%40thread.skype%22%7D
&groupId=34fd...ee05
&appid=364a...2ed6
context=...
の値はURLエンコードされている。デコードすると以下のように、JSON形式のデータであることがわかる:
{"subEntityId":null,"channelId":"19:b853....3e99@thread.skype"}
ここでsubEntityId
というプロパティがありながらあえてnull
指定されていることがわかる。
この値は何なのかとMicrosoft社のドキュメントを見てみると、次のような説明が見つかる:
このコンテンツが指すサブページの開発者定義の一意の ID。 このフィールドは、特定のコンテンツへのスクロールやアクティブ化など、ページ内の特定の状態に復元するために使用する必要があります。
今回の目的にぴったりなプロパティであることがわかる。
PowerAppsアプリのOnStart
アクションでこのプロパティの値を取り出して変数に設定する式を追加する:
Set(subEntityId, Param("subEntityId"))
あとはこの値を必要とする別の式やコントロールから参照するだけ。
こうしてPowerApps側アプリで準備ができたら、先ほどのURLのうち %22subEntityId%22%3Anull
(デコードすると"subEntityId":null
)とある箇所に、 %22subEntityId%22%3A123
というふうに任意の値を記述する:
https://teams.microsoft.com/l/entity/a6b6....7af9/_djb2_msteams_prefix_3...
?context=%7B%22subEntityId%22%3A123%2C%22channelId%22%3A%2219%3A...3e99%40thread.skype%22%7D
&groupId=34fd...ee05
&appid=364a...2ed6
これでメールやTeamsメッセージからURLを使って(Teamsに組み込まれた)アプリに画面遷移した時、subEntityId
で指定されたデータを初期表示するという動きが実現できる。
なお、前掲資料ではcontext
のプロパティとして他にもいろいろなものが列挙されている。
しかし私がほんの二三試してみた限りではsubEntityId
のように画面遷移時のパラメータとして活用できるものはあまり(or まったく)ないようである。