【PowerApps】フリーアドレスの席管理アプリSeMaSを作ってみた件

# 0. バージョンアップ
__SeMaS ver.2.0 を公開しました。__
https://qiita.com/noguhiro2002/items/8f4f3ce763f3ed538a50


# 1. はじめに
日本の企業に吹き荒れるフリーアドレス旋風。[良い話と悪い話が複雑に絡み合っています](https://gigazine.net/news/20200605-concentration-in-workplace/)が、もうこの流れは止められません。フリーアドレスは席を移動して開放的な環境で仕事できるのが大きな特徴ですが、一方、コロナウイルスなどの感染症対策においては「誰が何時にどこに座ったか」を追うことが重要になります。

この相反する二つの潮流をスマートに解決・両立するためにはスマフォアプリなどでの席管理システムの導入が有効ですが、いざ導入するとなると、多額の開発・管理費用が必要になります（開発/購入/インフラコストなど）。

そこで、この緊急時にOSSの力で少しでも世の企業や学校の役に立ちたい。そう思い、__PowerAppsで簡単なフリーアドレスの席管理アプリ（SeMaS: Seat Management System of Non-territorial office ver. 1.0）を作ってみました。誰が・どこを・何時使ったか(Who/Where/When)が全部記録されますので、追跡調査も容易です。PowerAppsが使えるMicrosoftの契約を結んでいる企業/学校/団体の方々、ぜひともお使いください。__

もちろん、__感染症対策のみならず、平時のフリーアドレスの運用でのご利用や、ちょっと内容を変えて備品管理、機器の使用ログなどにもご利用になれます。__

え？サーバー管理費用などが必要だって？
要りません。だって、Microsoftがすべてやってくれますから！
(しかし、MicrosoftとすでにPowerAppsなどが使える契約をしていることが前提です)

noguhiro2002/PowerApps_SeMaS (Github)
https://github.com/noguhiro2002/PowerApps_SeMaS


# 2. どうやって動く？

サクッと動作の様子がわかる３分ビデオを御覧ください！

Microsoft Power Appsでフリーアドレスの席管理システムを作ってみた Ver.1
https://www.youtube.com/watch?v=u-gk8lIR1sI
[![Microsoft Power Appsでフリーアドレスの席管理システムを作ってみた Ver.1](http://img.youtube.com/vi/u-gk8lIR1sI/0.jpg)](https://www.youtube.com/watch?v=u-gk8lIR1sI)

# 3. どうやって入れればよい？
__-->ご自身のMicrosoft PowerApps/PowerAutomate/Sharepoint環境に、ご自身で構築ください！__

以下、構築するための情報を記します。

## 3-1. まずは確認。構築に必要なMicrosoftサービス
以下のサービスが使えることが必須です。
- Microsoft Power Apps
- Microsoft Power Automate
- Microsoft SharePoint

なお、いわゆる__”Premiumサービス”は使っていない__ので、多くの方が使えると思います。


## 3-2. SeMaSアプリの全体像

![Microsoft Power Appsでフリーアドレスの席管理システムを作ってみた Ver.1](https://github.com/noguhiro2002/PowerApps_SeMaS/blob/main/ver1/describe_imgs/Slide2.PNG?raw=true)

ぱっと見シンプルですが、実際シンプルです。
動画で示させていただいたとおり、

1. QRコードをスマフォやタブレットで読み取ります（2021/2/23現在:PowerAppsはスマホやタブレットからしかQRコード読み取りに対応していません）。
2. PowerAppsがWho/Where/Whenを記録しているSharePoint上のList（SeMaSevents）を参照し、その席を使えるか・使えないかを判断します。
3. その席が使える場合は、SeMaSeventsに”着席”を記録するためのPowerAutomateのフロー（addCalendarFromApps）を動かします。一方、すでに誰かがその席を使っている場合はその旨をアプリ画面に表示します。
4. 席を離れる際は、SeMaSeventsに”離席”を記録するためのPowerAutomateのフロー（updateEndCalendarFromApps）を動かします。

この順序で動きます。

また、

1. オフィスで何処に誰が座っているかをシートマップで表示

をすることができます。

## 3-3. QRコードの準備
![Preparing QR code](https://github.com/noguhiro2002/PowerApps_SeMaS/blob/main/ver1/describe_imgs/Slide3.PNG?raw=true)

動画にさりげなく映っておりましたQRコードのホルダーですが、３Dプリンターで自作しました。そこにラベルプリンターで印刷したQRコード付きのラベルを貼り付けています。

__え？ホルダーを設計するのがめんどくさい？__
ご安心ください！QRコードホルダー設計ファイル(Fusion360)とSTLファイルを以下に置いておきました。もしよければお使いください。
https://github.com/noguhiro2002/PowerApps_SeMaS/tree/main/holder

## 3-4. データソースの準備
![Lists column description](https://github.com/noguhiro2002/PowerApps_SeMaS/blob/main/ver1/describe_imgs/Slide4.PNG?raw=true)

さぁ、早速プログラミングです。まずはデータの保存場所を作りましょう！
今回はSharePointのListsを利用します（別に画像のようなEntityが作れて、PowerAppsとPowerAutomateからアクセスできればCommon Data BaseでもなんでもOKです！）。

さぁ、上の画像を見つつ2つ

1. seatList
2. SeMaSevents

のListsを作ります。

### 3-4-1. SeatLists

![seatLists](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588752/988342e2-c32b-dcf7-346b-e4c038fe532f.png)

完成後のseatListはこのような感じになります。Excelなどで予め作り、SharePointにListsとしてインポートすると楽です。UUID作ったユニークなIDをseatUuidに書きます。ExcelでもUUIDは作れるのでしょうが、私は面倒なのでOnline UUID Generator(https://www.uuidgenerator.net )を利用しました。

### 3-4-2. SeMaSevents


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588752/ba5c4f2b-3520-47f8-2a3b-440fca86cc25.png)

完成後(そして少し使用中)のSeMaSeventsはこのような感じになります（なおハイライトの色はUsingとUsedを判別しやすくするために設定しました）。


## 3-5. PowerAutomateのFlow作成
完成したSharePointのListsに情報を席の使い始めと、離席の情報を書き込むFlowを下記の２つ作ります。

1. addCalendarFromApps
2. updateEndCalendarFromApps

以下の二つのFlowのExportしたファイル(.zip)を、以下のGithubサイトにアップロードしました。
（なおこのzipが使えるかどうかは確認しておりません。使えませんでしたら、以下の画像を参考にFlowを作っていただければ幸いです）

noguhiro2002/PowerApps_SeMaS/PowerAutomate/
https://github.com/noguhiro2002/PowerApps_SeMaS/tree/main/PowerAutomate

### 3-5-1. addCalendarFromApps

![addCalendarFromApps](https://github.com/noguhiro2002/PowerApps_SeMaS/blob/main/ver1/describe_imgs/Slide5.PNG?raw=true)

席を使用するeventをSeMaSeventsに書き込むFlowは図のようになります。席の使用始め時刻(startTime=現時刻)と、利用終了時間（とりあえず24 hours後として設定。endTime= now + 24 hours）、そして利用開始（Category="Using"）を記録します。

### 3-5-2. updateEndCalendarFromApps

![updateEndCalendarFromApps](https://github.com/noguhiro2002/PowerApps_SeMaS/blob/main/ver1/describe_imgs/Slide6.PNG?raw=true)


一方の、離席eventをSeMaSeventsに書き込むFlowは図のようになります。離席するとCategoryがUsingからUsedに変更され、離席時刻が記録(endTime)されます。



## 3-6. PowerAppsのプログラミング

すべて説明するには内容盛りだくさんで心折れました。下記リンク先にPowerAppsからExportしたファイル（.msapp）をアップしましたので、本ファイルをダウンロードしていただきPowerAppsでOpenしてください。その後、適宜修正し利用ください。

__作業中のSaveと、作業後のPublishは忘れずに！__

（そんなこと言われてもわからん！詳しく説明してくれ！という方は是非ともコメントお願いします）

noguhiro2002/PowerApps_SeMaS/PowerApps
https://github.com/noguhiro2002/PowerApps_SeMaS/tree/main/PowerApps


## 3-7. テスト＆利用開始

お使いのスマフォやタブレット（Android/iOS）のStore（PlayStoreやAppStore）で「Microsoft PowerApps」をダウンロードしていただき、ログイン後、上記で保存したSeMaSを起動してご利用ください。



# 今後の予定
時間があったら、以下の機能を追加したVer.2を開発したいですね。__使いたいです！などありましたらぜひコメントをください！それがモチベーションとなって製作スピードがアップするかもしれません！__

- 会議席などの”複数人が一つの席を使用”できる機能
- ちょっと別の席を使う（食堂など）で、”一人が複数席を使用”できる機能
- 壁掛けディスプレイなどで、そのオフィスの席使用状況が一覧できるようなView
- 席を予約できる機能
- 席を使う際に、部屋の入り口にあるタブレット端末でできるような機能
- 誰が何処にいるか（座っているか）を検索する機能
- いろいろと動作を軽くしたい
- （もっとちゃんとしたRelationなどを考慮したDBに修正）


# 謝辞＆あとがき
本プログラムは、Microsoft365 Developers Program(https://developer.microsoft.com/ja-JP/microsoft-365/dev-program )に参加し、その権限の範囲内で開発いたしました。Microsoftさん、楽しい時間をありがとうございました。

本ソフトのすべての情報はこのGithubのレポジトリ内の情報が正となります。
noguhiro2002/PowerApps_SeMaS
https://github.com/noguhiro2002/PowerApps_SeMaS

なお、本プログラムはBSD-3ライセンスで配布します。
本ソフトそのもの、及び本ソフトをもとに開発したプログラムにおいて生じた損害等は一切作者はその責任を負いません。すべて利用者の責任においてご利用ください。また、いかなる種類の保証も作者はいたしません。

__本ライセンスでの配布が問題でしたら、コメント欄でご連絡ください。__
（特にMicrosoft様、もしご覧いただきましたらよろしくお願いします）

# 最後に
なにかのコミュニティ（企業・学校含む）で使用する際には、ぜひコメントをください！開発のモチベが上がります！