Microsoft 365 SharePointのリストを使ってPowerAppsアプリを作ってみる

# 概要

SharePointに作成したリストから、PowerAppsアプリを作る方法について、自己学習メモとしてQiita記事にまとめます。

# 事前準備：SharePointにリストを作成

今回は、SharePointのリストを作成する際に、テンプレートとして事前に用意されている`案件管理`をそのまま使っています。
![スクリーンショット 2020-12-29 14.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/f4d70f1c-9d39-dd13-d71e-4f18d3d3142d.png)

# PowerAppsアプリを作成する

## SharePointのリストからPowerAppsのアプリの作成

SharePointの`案件管理`リストを表示した状態で、画面上部のメニューから PowerApps -> アプリの作成を選択。
![スクリーンショット 2020-12-29 14.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/88c784a5-1757-ede2-05a4-7a4b1e5e5f7d.png)

アプリの名前を入力して作成ボタンを押下
![スクリーンショット 2020-12-29 18.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/31ff92f2-f2d6-f653-d8ce-638f659ded94.png)

これだけで、案件管理リストをデータソースとしたPowerAppsのアプリが作成されます。
![スクリーンショット 2020-12-29 18.37.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/479e9204-bce7-d301-95b9-a8c640b1eab9.png)

## 動かしてみる

どんな感じでアプリが動作するのか動かしてみます。
PowerAppsStudioの画面右上にある再生ボタン（右向きの三角ボタン）を押下するか、F5キーを押下します。

![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/71062625-8126-5065-2953-c4e400619a86.gif)

機能としては

- 新規登録
- 詳細表示
- 更新
- 削除
- 検索一覧

という一通りのメンテナンス機能が備わっています。
また、画面デザインを自分で行っていないのですが、デフォルトで一覧表示項目などを配置してくれるため、何もしないでこれだけのクオリティの機能が作れるのは魅力的です。

# PowerAppsをカスタマイズする

## 検索条件のカスタマイズ

BrowseGallery1（垂直ギャラリー）を左ペインから選択すると、画面上部の数式エリアに以下のような式がセットされていることが確認できます。

```javascript
SortByColumns(Filter([@案件管理], StartsWith(Title, TextSearchBox1.Text)), "Title", If(SortDescending1, Descending, Ascending))
```

上記の式の`Filter`で指定されている部分をみると、`StartsWith(Title, TextSearchBox1.Text)`となっているため、Title項目（案件管理リストの「問題点」項目）の前方一致検索となっていることが分かります。
また、Title項目のみが検索対象の項目となっているため、他の項目は検索対象となっていません。

### 部分一致検索（あいまい検索）を実装する

`Filter`関数の部分を以下のように修正しました。
キーワードとしては`in`を利用します。

```javascript
SortByColumns(Filter([@案件管理], TextSearchBox1.Text in Title), "Title", If(SortDescending1, Descending, Ascending))
```

ただ、この指定を行うと以下のような警告が表示されます。
![スクリーンショット 2020-12-29 19.36.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/e1552846-c960-2baa-3ac7-f76d30109ed2.png)

この警告は以下のことを表しているようです。
> 委任に関する警告です。この数式の強調表示された部分は、大きなデータ セットの列 "Title" で正常に機能しない可能性があります。
> データ ソースは数式を処理できずに、不完全なデータ セットを返すことがあります。データ セットが不完全な場合、アプリケーションは正しい結果を返さないか、正常に機能しない場合があります。

これは、あいまい検索の場合、ヒットするデータが多いため、デフォルト設定の500行を超えて検索にヒットしてしまう可能性があり、正しい検索結果にならないかもしれないよ？という警告のようです。
ちなみに、500行の件数制限を変更するには、ファイル -> 設定 -> 詳細設定 -> 委任できないクエリのデータ行の制限 で設定を変更できます。
![スクリーンショット 2020-12-29 19.38.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/434259c4-016c-6f27-3946-c478bea53507.png)

### Filterで複数項目をOR検索

デフォルトでは、Title（問題点）項目だけが検索対象となっていましたが、案件の説明項目も検索対象としたい場合に、Title（問題点）項目**または**案件の説明項目に、検索キーワードが含まれていたらFilterする。
ということを実現する場合、以下のように指定します。

```javascript
SortByColumns(Filter([@案件管理], TextSearchBox1.Text in Title || TextSearchBox1.Text in 案件の説明), "Title", If(SortDescending1, Descending, Ascending))
```

上記は`案件の説明`というSharePointのリストの項目日本語名称をそのまま利用した場合。
実際、この案件の説明という日本語名称に対し、実は英語名称も設定されているらしく、以下のように指定することもできます。

```javascript
SortByColumns(Filter([@案件管理], TextSearchBox1.Text in Title || TextSearchBox1.Text in Description), "Title", If(SortDescending1, Descending, Ascending))
```

`Description`という項目が案件の説明項目に該当する英語名称となります。
では、どこでDescriptionという名前を確認するのか？
SharePointのリスト上では、確認する方法が分かりませんでした。

PowerAppsStudioの、Filter関数にカーソルを合わせた状態だと、以下のイメージのように、データソースの[@案件管理]の各項目データなどが確認でき、その項目名称（表示名称を日本語名称に変更する前のリスト作成時点の物理名）を確認することができます。
![スクリーンショット 2020-12-29 19.49.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/894a9565-e456-9f9d-dc07-43f123d9b343.png)

## 詳細画面のTitle項目の名前を変更する

SharePointのリストの制限として、必ず「Title」という項目を1つ必須項目として設けなければいけないというルールがある。
そのため、リストの表示上は`問題点`という名前で表示されているものの、PowerAppsで扱う際には`Title`となってしまっている。

詳細画面でTitleと表示されていても、なんとなく分かるものの、SharePointのリストと紐付きが分かりやすいように、表現を合わせておきます。
Titleの項目にカーソルを合わせて、ダブルクリックすることで編集モードになるのですが、この状態で変更しても、その変更が永続化されることはありません。（一時的に変更されるだけです。）
項目名＋項目データの組み合わせを`カード`というオブジェクトでセットで管理されており、これがロックされている状態のため、プロパティ情報が変更できないみたいです。

変更するためには、Title項目のCardオブジェクトを選択し、`プロパティを変更するためにロックを解除します`を押下します。
![スクリーンショット 2020-12-30 16.09.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/e8d4f568-a4f4-0d57-5d52-d6cb564a3f60.png)
以下のように、`DisplayName`プロパティの値を変更することで、表示名称をTitle→問題点に変更することができます。
![スクリーンショット 2020-12-30 16.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/1776ef67-4799-b2b0-f949-9327cf41fe45.png)

# 補足

とりあえず、PowerAppsがどんなもんなのか、ちょっとだけですけど触ってみました。
Microsoftは、PowerAppsでアプリを開発することを、`開発`とは言わず`作成`と表現しているようです。
Non codingでアプリが作れるし、データソースとしてSharePointのリストや、OneDrive上のExcelデータなど、
さまざまなものが利用可能で、そのデータ定義から、デフォルトで基本的な機能を備えたアプリを簡単に`作成`できるのは確かに魅力的でした。

ただ、それなりに**お作法**があるようで、そのお作法をある程度覚えておき、調べ方を把握しておかないと、全くリテラシーの無い人が、簡単にアプリを作成する。というレベルでは無いかなぁと思いました。

今回作成したレベルのアプリであれば、どちらかというとKintoneの方がより簡単に作成することができるイメージです。
KintoneもExcelで用意したデータをアプリ作成時にロードさせることで、簡単に検索一覧／詳細表示／登録／更新／削除／CSVインポート／CSVエクスポート機能などを備えたアプリが作成可能なため、PowerAppsよりは難易度低めかなと感じました。

逆に、Microsoft 365 Business Basicなど、すでにTeamsやSharePoint、Office製品をMicrosoft365で利用しており、
その利用料金の範囲内で、業務効率をアップさせるアプリの構築やデータの永続化、RPAのような部分的な自動化を実現することができるのはメリットだと感じます。
（Kintoneの場合は、１人あたり１，０００円近く月額を払う必要があるので、Microsoft365に加えて契約すると、さらに費用が掛かってしまうため。）

Microsoft365を契約している企業の場合、このサービスを余すことなく活用できれば、高額な開発費用をかけたうえで、さらにメンテナンス費用もかかり、ランニングコスト（保守費用）をかけ、いずれ使われなくなるようなシステムを作ることなく、色々なことが実現できそうだなぁと思いました。
もちろん、`自社の業務に構築するシステムを合わせる`ような開発方法を選んでしまうと、どんなものでも失敗するとは思いますが、`Microsoft365が得意とするシステム開発に業務を合わせていく`スタイルであれば、かなりのパフォーマンスを発揮してくれるんだろうなぁと思います。

# メモ

PowerApps向けの数式リファレンス
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/formula-reference