PowerAppsでとある問題にぶつかりました。その内容と解決策を共有します。
O365サービスのPowerApps + SharePoint を利用して、アプリを作成したが、利用中に競合エラーが頻繁に発生する人に向けた記事です。
エラー内容
PowerAppsの操作中(SharePointのリストを更新する操作中)に以下のエラーが発生。
ETAG mismatch.Conflicts exist with changes on the server, please reload.
Server Response: ETAG mismatch. clientRequestId: xxxxx-xxxxx-xxxxx serviceRequestId: xxxxx-xxxxx-xxxxx」
環境と概要
PowerAppsで開発したアプリをリリースしたところ、「サーバ上の変更内容に競合があります。」というエラーが頻繁に発生するようになりました。
構成(ご参考までに)
画面:PowerApps
データ格納先:SharePoint
データ更新・通知:MS Flow / PowerApps
開発段階、デモンストレーション(4人で実施)では競合エラーは発生しませんでした。
原因
原因はSharePointのリストを更新するときにETAGが最新でないため、エラーとなっていました。
この問題はMicrosoft のPowerAppsコミュニティでも議論されていました。
日本語の解説サイトがなかったので、かみ砕いた内容を紹介します。
原文:
https://powerusers.microsoft.com/t5/General-Discussion/Server-Response-ETAG-mismatch-clientRequestId-serviceRequestId/m-p/144891/highlight/true#M49710
対策
画面の遷移や更新を行うときは最新のSharePointのETAGを取得する必要があります。
基本的に画面の遷移を行うときや、更新処理などのボタンを操作する時は、
SharePointのリストの情報を更新するようにしましょう。
Refresh(SharePointのリスト名);
Navigate(遷移したい画面,ScreenTransition.Cover)
Refreshの具体的な利用方法についてはMSのdocsに詳しく記載されております。
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-refresh
気を付けないといけないのは 読み込み 更新 どちらでも「Refresh」する処理を入れる必要があります。
PowerAppsは日々加速しているため、とあるアップデートで改善する場合があるかもしれません。
付録:もっと詳しく解説
ETAGって何?
ETAGはHTTPのヘッダに含む情報で、"ある時点のリソースの状態を識別"するための情報です。
ETAGはSharePointにアイテムに更新が行われるたびにアイテムのETAGが書き換わります。
ETAGの考え方
AさんとBさんの二人がPowerAppsの画面にアクセスするとETAGは以下のようになります。
Aさん画面(ETAG=0001) | SharePoint(ETAG=0001) |
Bさん画面(ETAG=0001) |
この状態からAさんがSharePointに更新を行うと以下のようになります。
Aさん画面(ETAG=000X) | SharePoint(ETAG=000X) |
Bさん画面(ETAG=0001) |
Bさんが最新のSharePointの情報を取得せずに、リクエストを投げると競合エラーが発生します。
最後に
PowerAppsの知名度はそこまで高くはありません。しかし、社内のちょっとした改善をしたい時にかなり有効なツールです。
Microsoft PowerAppsについては公式サイトもチェックしてみてください!
https://powerapps.microsoft.com/ja-jp/