PowerAppsで、リモートワークしているメンバーの居場所を共有する

#背景
私の職場ですが、本社・開発センター・工場が比較的に近い位置にあり、以前まで一旦本社に出社して、あとは必要に応じて移動して、打合せや仕事をして、誰がどこにいるかは本社のホワイドボードの行き先掲示板に書いてあるみたいな運用でした。
ですが、ニューノーマル時代の働き方で、リモートワークも含めて、「そういえば、あの人、今日どこにいるんだろ？」みたいな情報を緩く共有することで円滑な業務が出来ないかというトライアルをやってみてます（とりあえず、私の部署だけですが）。
打ち合わせや現場との調整の仕事もあるので、完全リモートワークが実質的に難しい環境で（ハードウェアも絡むので）、尚且つ、以下の課題が少しでも解決できないのかなと思ってやってみています。

* 他部署の人が、フロアに来ても誰がどこに行ったか分からない
* 自分たちも、誰がどこにいるのかが直感的に分かりにくい（スケジュールの共有はしているので、ちゃんと調べれば分かるけど、そうじゃないみたいな）

#作ったもの
社給スマホのGPS情報を使って、どこの事業所にいるかを判断して共有が可能なシステムを作りました。リモートワークや客先外出の場合もあるので、事業所以外は全て「その他」で表示するようにしました。各自の居場所が一目で分かるのと、自分の居場所は名前を選択するとGPS情報から特定して共有されるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/2932fb3a-83e3-06a1-d8a9-31f5e2e22a94.png)

#大切なプライバシー
「GPSでどこにいるかが完全にバレる！」となると、結局は本来の目的が薄れて、何故か監視みたいになってしまうというのが、大きな課題だと思ってます。なので、今回は、あくまで本社・開発センター・工場・その他の分類をスマホ側で行い、詳細なGPS情報は共有されないようにしました（サーバー上にも残しません）。

#PowerAppsで実装したポイント

###場所の特定
[ラベル]を使って、本社・開発センター・工場・その他の４分類で特定します。分類が多くないので、IF文で力業で実装しています。建物内だとGPS精度も良くないので、ざっくりその近辺にいるぐらいの範囲で判定しています。パラメータは適当です。力業ですが、結構それなりに動いており、ある程度の個所＋あまり近くないなら、これで十分な気がします。
これで、本社・開発センター・工場・その他で判定されます。共有されるのは、この判定結果のみになります。

```
If((36.xxx - 0.003 < Location.Latitude) && (Location.Latitude < 36.xxx + 0.003) && (136.xxx - 0.003 < Location.Longitude) && (Location.Longitude < 136.xxx + 0.003), "本社", (36.xxx - 0.003 < Location.Latitude) && (Location.Latitude < 36.xxx + 0.003) && (136.xxx - 0.003 < Location.Longitude) && (Location.Longitude < 136.xxx + 0.003), "開発センター", (36.xxx - 0.003 < Location.Latitude) && (Location.Latitude < 36.xxx + 0.003) && (136.xxx - 0.003 < Location.Longitude) && (Location.Longitude < 136.5818 + 0.003), "工場", "その他")
```
アプリケーション上では、このような感じで緯度・経度を使って、場所が特定されて、その情報を確認することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/35c98157-a4cf-3c0f-bfad-1b70ec582461.png)


###定期的な処理の実行
[オーディオ コントロール]をタイマー代わりに使うことで、バックグラウンドでの実行にも対応します。音楽データは、定期実行したい周期の無音の音楽データを用意しました。音楽が終わるたびにGPS情報を更新して、位置情報が更新されたタイミングで上記の[ラベル]も更新されるので、そのラベル情報を使って、SharePointリストと同期を行います。（SharePointリストが"WhereAreYou"という名前を付けてあります）
・LocationをON/OFFすることで位置情報の更新します
・平日と取得したい時間でマスクしてデータ更新をします←これも大切

```
Disable(Location);
Enable(Location);
If(Weekday(Now(), StartOfWeek.MondayZero) < 5,
If(7 <= Hour(Now()) && Hour(Now()) <= 20, 
Patch(WhereAreYou,First(Filter(WhereAreYou,タイトル=RadioName.Selected.Value)),{Location:lblLocation.Text},{Date:Now()})
)
);
Refresh(WhereAreYou);
```
「何故、[オーディオ コントロール]を使うんだ？」という疑問はあると思いますが、「[【Power Apps】バックグランドで緯度経度を取得する](https://papasensei365.com/powerapps-get-latlong-background/)」の記事を参考にさせて頂きました。私が試した環境では、Android端末ではそれなりに安定はしますが、一定時間を経過するとやはり更新が止まるような感じです。あとは、iPhoneの場合はアプリを立ち上げている状態でないと更新されない感じです。

###人物の特定
「誰の社給スマホか？」までは特定が必要がないと思ったので、「誰か」は[ラジオ コントロール]で選択してもらうことにしました。上記にあるように、バックグラウンド処理が正しく実行されないこともあるので、名前を選択した際に必ず情報を更新するようにしてあります。処理自体は、上記と同じで、[OnSelect]内で選択されたときに即時実行するようにしてあります。

###部署のフロアに来た人向けのサイネージ
オフィスにサイネージを用意して、WEBブラウザーで同じアプリを表示させておきます。[データテーブル]に「名前・居場所・更新時間」を表示させるようにして、これで他の部署の人がフロアに来た時にも誰がどこにいるのかが一目で分かるようにしました。これは、同じPowerAppsアプリをWEBブラウザで表示するだけです。

WEBブラウザーでの実行は、Dynamics365でサインインして表示しています。「[アプリを Web ブラウザーで実行する](https://docs.microsoft.com/ja-jp/powerapps/user/run-app-browser)」を参考にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/977f94f9-9d11-8603-f7b9-30658e41cd10.png)



#今後の課題
バックグランド処理の安定性向上。
Androidでも完全に安定して処理されるという訳ではないですが、iOSはかなり難しい印象。
「移動先で必ずアプリを開いて更新して下さい」という運用回避的な話もありますが、それなら「もう外出先から自己申告で場所を入力すればいいじゃん」みたいな話になって、最後にやるやらない問題に帰着してしまうので、なんとか自動化で対応はしたいと思ってます。ただ、プラットフォーム依存なのでどうしようにも手出しできない感じもあります。

#まとめ
当初の目的であった、「そういえば、あの人、いまどこにいる？」みたいな緩い繋がりを構築しながら、上手く新しい時代の働き方を模索するにはそれなりに使えているような気がします。
あとは、自分もユーザーなので、別にどこかにいってサボる訳じゃないですが(笑)、「なんなく詳細位置まで特定されたくない」という感情を上手く緩和してくれているような気がしています。まぁ、ちなみに社給スマホなので、会社で権限がある部隊が本気になれば、すぐに居場所は特定されてしまいますので、そういった意味での「自律」はもちろん必要です(笑)