Office 365 だけで業務アプリを作る

12 月はずっと Office 365 ばかりいじっていました。
これまでやったことを忘れてしまいそうなので、ここに備忘録として置きます。

# はじめに
ある時、ある方たち (老若男女問わず) がある場所に訪れた時に質問カード (個人情報も含む) に回答をご記入いただき、それを見て Excel に入力。当日分を集計してまとめ役に報告するということをやっていた模様。なお、時と場所などによりこのフロー自体それぞれでオリジナリティが溢れているようです (目的はいっしょでもそのための手段は人・場所でそれぞれ)。

絵にしてみると、こんなかんじかしら。
![before.png](https://qiita-image-store.s3.amazonaws.com/0/230264/319e69f8-dfe2-afd0-66c8-9c0e5c6934a1.png)

紙を見ながら Excel 入力なんてとてもしんどい作業だと想像できます。気を失いそうです。だけど、やりたくない作業でも人力でやらないといけない時があります。ただ、少し工夫すればちょっとはラクできるかもしれませんね。

# 改善策を考える
- もれなく [Office 365 (E3)](https://products.office.com/ja-jp/business/office-365-enterprise-e3-business-software) は導入する (導入済み)。
- 現場と会議室 (あくまでイメージ的にいうと)、およびメンバー間のコミュニケーションを強化するため、[Microsoft Teams](https://products.office.com/ja-jp/microsoft-teams/group-chat-software) をメインで使いたい。

ということで、プラットフォームとして Office 365 は使えますというしばり。
試行錯誤した結果、以下の点についてシステムで解決できるだろうと思いました。

- Excel シートへの情報入力はしんどい
    - シンプルで分かりやすい UI を提供する
    - マルチデバイス対応して PC だけでなく、スマートフォンでも操作できるようにする
- 入力した情報を集計するのもしんどい
    - 人の手が介入しない (操作ミス、不正操作などを抑止) 集計処理を実現する
- これらの情報は Teams からカンタンアクセス

そして、これらを用いた運用フローの提案へと持っていければ良いでしょう。

# システム構成
このシステムの構成を以下のように考えました。これらをすべて Office 365 だけで実現しようと思います。
![after.png](https://qiita-image-store.s3.amazonaws.com/0/230264/c2442d35-cf93-fa79-faf1-e8f26d65648d.png)

- 各種データの格納場所 (データソース) は、[SharePoint Online](https://products.office.com/ja-jp/sharepoint/collaboration) でチームサイトを作り、そのチームサイト内のリストとする
- 現場での情報入力は [PowerApps](https://powerapps.microsoft.com/ja-jp/) で作成したアプリで行う
- 入力した情報の集計は [Power BI](https://powerbi.microsoft.com/ja-jp/) でレポートを作成して見える化
- 各情報などは Teams のタブに掲載する

# データの格納場所 (SharePoint Online)
各業務で入力された情報は SharePoint チームサイト内のリストに格納することにしました。その理由として、以下のことを挙げてみました。

- 排他制御を良しなにやってくれる (アプリで考慮する必要なし)
- ビュー、ソート、フィルターはリストの機能に任せる (操作方法はみな同じ)
- 装飾せずにそのまま閲覧できる (Excel チックじゃない)
- 他にも使い道があるかも

SharePoint リストを作る際の注意点として 2 点ほど。

## 列名は「英数字」で作って「日本語」に更新
「日本語」の列名 (内部名) で列を作ってしまうと UTF-16 でエンコードされてしまい、後述する PowerApps や Flow で取り扱いづらくなってしまいます。

![field1.png](https://qiita-image-store.s3.amazonaws.com/0/230264/a706c546-223e-aa63-6857-43ec9242a9da.png)

これを回避するためには、はじめに追加するすべて列名を「英数字(半角)」で作成し、その後、列の編集で「日本語名」に変更します。このようにすることで、列名は「英数字(半角)」、表示名は「日本語」というふうに作成することができます。

![field2.png](https://qiita-image-store.s3.amazonaws.com/0/230264/d4297ae1-92ac-1fbf-82c6-3313697afbc0.png)

## 列の種類
ついちょっと前まで、PowerApps アプリで SharePoint リストの列の種類が「選択肢」の項目を上手く操作できませんでしたので、代わりに列の種類が「参照」の項目を取り扱うことにしていました。
![type_reference.png](https://qiita-image-store.s3.amazonaws.com/0/230264/f9081cb2-0085-557f-dd85-6d7fc4a1c676.png)

しかし、改めて動作確認してみたところ、列の種類が「選択肢」の項目もサポートしていました。
![type_choice.png](https://qiita-image-store.s3.amazonaws.com/0/230264/127df596-b2e0-f0d3-afa2-a7417cdf704d.png)

PowerApps アプリを作成する際は、以下の記事で取り扱おうとしている「列の種類」がサポートされているかチェックしましょう。

[参考 : PowerApps から SharePoint に接続する＞既知の問題](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/connections/connection-sharepoint-online?WT.mc_id=DX-MVP-5003113#known-issues)

# 現場での情報入力アプリ (PowerApps)
![powerapps.png](https://qiita-image-store.s3.amazonaws.com/0/230264/c7ffbfe2-aaf5-4218-a593-a354122039af.png)
前述したとおり、紙を見ながら Excel シートに入力するのはとてもしんどいです (個人の意見ですけど)。もっとフレンドリーな UI で操作したほうがラクだと思うので PowerApps でアプリケーションを作りました。

以下の記事の手順のとおりに作りました。
[参考 : PowerApps で SharePoint リストからキャンバス アプリを作成する](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/app-from-sharepoint?WT.mc_id=DX-MVP-5003113)

## レイアウトは縦向きなの？
ただ、レイアウトが縦向きだと、Teams のタブにも縦向きで表示されて両脇がスカスカでちょっとカッコ悪い。そのあたりは「アプリの設定」で [向き] を「横」、[縦横比をロックする] を「オフ」に設定することでいい感じにフィットしました。また、[向きをロックする] を「オフ」に設定することにより、スマートフォンを縦向きにしても操作することができます。
![app_setting.png](https://qiita-image-store.s3.amazonaws.com/0/230264/f616d680-08d7-5f69-7837-b37ee3335128.png)

# 入力した情報を集計 (Power BI)
集計結果は Power BI レポートで作ることにしました。当初は以下のとおりデータソースを直接 SharePoint リストを参照しようと思いました。
![powerbi01.png](https://qiita-image-store.s3.amazonaws.com/0/230264/80212bfd-71b3-983d-379d-ef504ba5ba79.png)
しかし、SharePoint Online には昔からある「5,000 件問題」というものがあり、これを回避する必要があります。
[参照 : リスト ビューのしきい値によって発生する現象と対処策 - Japan SharePoint Support Team Blog](https://blogs.technet.microsoft.com/sharepoint_support/2015/05/15/31574/)

## データソース問題を回避 (Microsoft Flow)
前述の「SharePoint Online 5,000 件問題」は、1 リクエストで要求するアイテム数を 5,000 未満に押さえる必要があるというもの。
このシステムのデータ格納場所として取り扱う SharePoint リストはいずれ 5,000 件を超えることもあり得るので、単純に Power BI レポートのデータソースをこの SharePoint リストを指定すると取りこぼす可能性が大きいです。 これを回避するには、(このような問題が顕在していない) 中間データベースみたいなものを設けて。これをデータソースとして参照すれば良いかと思います。

試行錯誤した結果が以下の図。
![powerbi02.png](https://qiita-image-store.s3.amazonaws.com/0/230264/5b0fcb8f-df16-7c3e-1948-b558bde7e3a3.png)
まず、Power BI レポートのデータソースを、同じチームサイト内のドキュメントライブラリ上の Excel ブック (テーブル) としました。この Excel ブックを参照させることでこの「5,000 件問題」は回避できると考えました。

## SharePoint リストから Excel ブックへどのようにコピーするか
Microsoft Flow で作ったフローで SharePoint リストからアイテムをコピーします。SharePoint リストからアイテムを読み取る際の条件として「更新日時の降順でソートした結果の上位 5,000 (この値はもう少し低めに) 件」と指定します。
![flow01.png](https://qiita-image-store.s3.amazonaws.com/0/230264/313aed5a-3c83-2602-579c-2a896f855716.png)
あとは、この条件で取りこぼしがないよう (仮説を立てる) にスケジュールトリガーのインターバルを指定すれば良いでしょう。
![flow00.png](https://qiita-image-store.s3.amazonaws.com/0/230264/ab3d2ae9-a065-fee8-3adb-b0ad39d54624.png)
※1 時間で 5,000 件以上の登録はないだろうという仮説の上で。

[参考 : SharePoint Connector Reference](https://docs.microsoft.com/en-us/connectors/sharepointonline/?WT.mc_id=DX-MVP-5003113)
[参考 : Excel Online (Business) Connector Reference](https://docs.microsoft.com/en-us/connectors/excelonlinebusiness/?WT.mc_id=DX-MVP-5003113)

## SharePoint ドキュメントライブラリ上の Excel ブックの URL
Power BI レポートで SharePoint ドキュメントライブラリ上の Excel ブック (テーブル) を参照する場合は、その Excel ブックの URL を取得する必要があります。以下の記事にその手順が記載されていますので、ご参照ください。

[参考 : Power BI Desktop で OneDrive for Business リンクを使用する](https://docs.microsoft.com/ja-jp/power-bi/desktop-use-onedrive-business-links?WT.mc_id=DX-MVP-5003113)

# Teams のタブに掲載する
Teams のタブ機能に地味だけどとても使えるヤツです。
今回取り上げた「PowerApps アプリ」、「SharePoint リスト」、「Power BI レポート」は (一部は発行という行為が必要) すべて URL が取得できるので「Web サイト」としてタブに掲載できます。
[参考 : Microsoft Teams で組み込みタブとカスタム タブを使用する](https://docs.microsoft.com/ja-jp/microsoftteams/built-in-custom-tabs?WT.mc_id=DX-MVP-5003113)

Teams でボットやタブを利用した外部アプリを許可する場合は、「外部アプリのサイドローディングを利用できるようになります」を「オン」にしましょう。
![teams_setting.png](https://qiita-image-store.s3.amazonaws.com/0/230264/931f9980-b154-5595-e6fb-e7a4e384b478.png)
[参考 : Office 365 を使用する組織で Microsoft Teams の機能を管理する](https://docs.microsoft.com/ja-jp/microsoftteams/enable-features-office-365?WT.mc_id=DX-MVP-5003113)
[参考 : Microsoft Teams でのアプリの管理設定](https://docs.microsoft.com/ja-jp/microsoftteams/admin-settings?WT.mc_id=DX-MVP-5003113)

# まとめ
Office 365 だけで業務アプリケーションをカンタンに作ることができます。

ちまたには、Web アプリケーションをノンプログラミングで開発するツールがいくつかありますが、これらと Office 365 でのアプリケーション作成とを比べてみると、Office 365 はツールだけでなくしっかりとしたインフラ (実行環境) も提供されているところに強みがあると思います。

Office 365 は SaaS 型のサービスなので、負担が少なく運用することができるでしょう。