PowerAppsで遭遇する５つの委任問題とちょっと強引な回避方法（SharePointリスト利用時）その２

(2019/08/13)
選択肢のフィルタリング処理は委任可能になりましたので、本記事の手法は不要となりました！！
…が、次回の記事（その３）で紹介している"ケース４：動的にフィルタ処理したい"場合は、私が知る限り本記事の手法一択なので、記事としては残すことにしました。ご興味ある方はその３と併せてご覧ください。

次回の記事（その３）↓
[PowerAppsで遭遇する５つの委任問題とちょっと強引な回避方法（SharePointリスト利用時）その３](https://qiita.com/KodamaJn/items/170c1a8eb364165faf5a)

---
前回の続きです。本記事をご覧になりたい方は、先に前回の記事（その１）をご覧いただくと話がスムーズです↓
[PowerAppsで遭遇する５つの委任問題とちょっと強引な回避方法（SharePointリスト利用時）その１](https://qiita.com/KodamaJn/items/4341865e6784847a005d)
<br>

その２では、前回ほどではないけれど、そこそこ委任問題に遭遇した以下のケース

　ケース３："新規"ステータスのものだけ表示させたい（選択肢のフィルタリング）

について、私が実際に行っている、委任問題のちょっと強引な回避方法について紹介します。


# 紹介で利用するデータソース
ここでは、以下のSharePointリスト「テストリスト」について考えます。
※列の種類は、前回の記事の作業終了時点の状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/45faffba-ec58-0e0c-9b9f-5850cdd5a0ef.png)



#ケース３："新規"ステータスのものだけ表示させたい（選択肢のフィルタリング）
つまり、選択肢列をフィルタ処理するケースです。
例えばタスク管理で「新規」「対応中」「完了」の３つのステータスを選択肢として持ち、そのうち「新規」のものだけ表示させる、などです。
選択肢の持たせ方は色々な方法があるかと思いますが、ここではSharePoint側で定義された"選択肢"列をフィルタリングすることについて考えます。

まずは、SharePoint側に選択肢列"ステータス"を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/e06c8834-afaf-0062-c33b-a3c9244936ae.png)
選択肢には、例で挙げた「新規」「対応中」「完了」を設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/2dedfada-25c3-f409-a30f-de7e9e6baf83.png)


適当に値をセットし、分かりやすくするためにGallery内にステータス情報を"ThisItem.ステータス.Value"で表示させておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/62a71948-0ac6-35db-5e04-1921bf5f140a.png)


準備が整いましたので、早速、選択肢列"ステータス"に対して新規のみに限定するフィルタ処理をGalleryに書いてみます。
選択肢の情報は、列名.Valueで取れるので…


```:Items
Filter(テストリスト,ステータス.Value = "新規")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/4af7af8c-73b6-8a0a-0507-ad44a157b497.png)
委任警告さん、また会ったね。
どうやら.Valueで選択肢の情報を抽出する処理が委任できないようです。
私が知る限り、SharePointの選択肢列のフィルタ処理は委任できません。
<br>

### 回避方法
そこで自社では、選択肢列でフィルタ処理することを諦め、代わりに数値列を利用してステータス情報を数値で持ち、その数値をフィルタリングすることにしました。
ここでは、数値とステータスを以下のように定義することにします。

| 値 | ステータス |
|---:|:----------|
| 1  | 新規      |
| 2  | 対応中    |
| 3  | 完了      |

<br>
#### 1. 列の変更
SharePoint側で先ほどの列"ステータス"の列の種類を選択肢から数値に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/2e15dfef-5d0e-4292-4b93-0e9392c6b47f.png)
※すでにステータス列にデータがある場合は、ステータス列の中身が抹消されます（以下警告）ので、抹消されると困る場合は別途数値列を追加してから該当の選択肢列を削除するなどしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/2a488a93-7d40-78a6-cb97-ba851fb5e25f.png)

列の種類を変更したら、先にSharePoint側で値を入れておくとよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/aa88bf53-7933-6db5-46ae-c98df02982ae.png)


#### 2. フィルタ処理書き換え
列を変更したら、PowerApps側で情報を更新し…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/326da398-297b-5ff6-aa00-a94cd134a719.png)

フィルタ処理を以下のように書き換えます。
（新規は1と定義したので、ステータス=1とする）

```:Items
Filter(テストリスト,ステータス = 1)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/19f4ffd5-01a5-6f81-133c-f7f71c64f228.png)
委任警告が消えました。めでたしめでたし。
…ってあれ？？フィルタは良いとして、Gallery内のステータス情報が表示されなくなりました。
ステータス情報を"ステータス.Value"で取得していたため、数値列に切り替えたことで取得方法が変わったことが原因です。
だからといって"ステータス"をそのまま持ってくると数字しか取れませんので、数字に応じてステータス表記を切り替えることにします。

この表記の切り替えはこの後何度か出現します。処理共通化のため、まずAppのOnStartで以下のCollection：StatusListを定義します。

```:OnStart
ClearCollect(StatusList, 
    Table(
        {Val:1,Txt:"新規"},
        {Val:2,Txt:"対応中"},
        {Val:3,Txt:"完了"}
    )
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/92724974-70fa-cea0-0051-d9b59858bd71.png)
StatusListの中身はこんな感じ↓

| Val | Txt    |
|----:|:-------|
|   1 | 新規   |
|   2 | 対応中 |
|   3 | 完了   |

「Collection？？はぁ？？」という方は、以下の記事がとても分かりやすいのでご一読ください。
[おぼえておくと便利そうな PowerApps の変数やコレクションの基礎（idea.toString();）](https://idea.tostring.jp/?p=4121)

記載しただけではまだStatusListに値が入っていないため、忘れずにAppの横にある"…"をクリックしてOnStartを実行しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/361b62f7-6209-3bf0-a53f-da02c780297e.png)

そして、表示エラーになった該当のラベルのTextに以下を記載します。先ほど定義したStatusListから、ステータスの値に合う日本語（1なら新規、2なら対応中、3なら完了）を抽出する処理です。

```:Text
LookUp(StatusList, Val = ThisItem.ステータス).Txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/0ab475de-e6ec-4f8d-4868-3efc019d9a9c.png)
これで、フィルタ処理の書き換えは完了です。

<br>
#### 3. 変更した列のデータ選択方法
上記の処理だけでは、アイテム登録/修正時にステータスの"数値"を選択することになってしまいますので、フォームでステータスの"名前"を選択できるよう修正を加えます。
まずは、先ほどの"ステータス"列をフォームに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/67d8dc20-46ad-06e0-2b77-144de0204671.png)

※※※補足※※※
追加後にキャンバスで以下のようにエラーが表示される場合は、追加した"ステータス"列が選択肢列のままになっている可能性がありますので、以下の手順でデータソースをつなぎ直してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/dc13b2b8-785e-85b0-6609-1d5d90dc7709.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/467ab66e-97f3-4a7d-2065-4a63c123c55c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/6e91503d-4a3c-eff6-5cc0-0324795d9484.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/f23fb0c7-5891-59ec-cc30-d11539c570a2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/d8db2a4a-1964-b0e7-624a-24e9f50a7fd4.png)
上記作業が終わったら「3. 変更した列のデータ選択方法」を初めからやり直してみてください。
※※※補足ここまで※※※
<br>

続いて、追加した"ステータス"カードのコントロールの種類を"許可値"に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/69ed49fa-6656-10ba-07a3-869329af282f.png)


追加した"ステータス"カードのロックを解除し、カード内にあるドロップダウンのプロパティを各々以下のように書き換えます。
ItemsのStatusListは、先ほど定義したCollectionです。
ドロップダウンの表示がステータスの"名前"になるよう、ValueにはTxtを指定します。
Defaultには先ほど一覧画面のステータス表示で利用した処理と同じ処理を記載します。これがないとアイテムの修正時にステータス値が正常に表示されません。

```:Items
StatusList
```

```:Value
Txt
```

```:Default
LookUp(StatusList, Val = ThisItem.ステータス).Txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/e7c648f3-86aa-a8e5-ee23-46bf1d47b741.png)

最後に、"ステータス"カードのUpdateプロパティを、ドロップダウンのVal列を利用するよう修正します。

```:Update
DataCardValue8.Selected.Val
// ドロップダウン名は適宜置き換えてください
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/ed666635-6914-921a-ce00-8d5bdba38e1c.png)
これで、フォームの修正は完了です。

<br>
#### 4. 変更した列の詳細画面での表示方法
このままだと、一覧画面でアイテムを選択した際に表示される詳細画面（DetailScreen）でのステータスの表示が数字になってしまうため、修正する必要があります。
（詳細画面にステータスを表示させない場合は省略可能）

まずは、"ステータス"列をフォームに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/f0597744-4518-afe4-7f26-9f58d6cfa293.png)
※※※補足※※※
追加後に、先ほどのフォーム画面のようにエラーが表示される場合は、「3. 変更した列のデータ選択方法」と同様の方法でデータソースをつなぎ直してください。
※※※補足ここまで※※※

追加した"ステータス"カードのプロパティを変更するためにロックを解除し、カードのDefault値を以下に書き換えます。
先ほど一覧画面やフォーム画面のステータス表示で利用した処理と同じです。

```:Default
LookUp(StatusList, Val = ThisItem.ステータス).Txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/fc8cf9ee-d86b-9a09-3a32-2ad1145f4e96.png)

これで、詳細画面の修正は完了です。


### 完成！
以上で、「ケース３："新規"ステータスのものだけ表示させたい」は完成です。

完成イメージ↓
※違いを分かりやすくするため、切り替えスイッチでフィルタ処理を切り替える処理を追加しています。
![Rec1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/f7b68711-7620-1ff6-0783-94c6a3c0431d.gif)



#まとめ
選択肢列をGalleryでフィルタ処理するために、選択肢列を捨てるという、ちょっと（かなり？）強引な方法についてご紹介しました。
自社のアプリではこの方法を用いて、ステータスやカテゴリのフィルタ処理を行っています。

<br>
ちなみに、今回のケース３の方法を見て、
> ステータス名を保持したいのなら、なぜ"新規"などのステータス名をそのままテキスト列に保存せずに、わざわざ数値列を使って面倒な処理にしたの？？

と思われた方、おっしゃる通りです。
実はこれには目的がありまして…というお話は、また次回にしたいと思います。


ご参考になれば幸いです。

その３はこちら↓
[PowerAppsで遭遇する５つの委任問題とちょっと強引な回避方法（SharePointリスト利用時）その３](https://qiita.com/KodamaJn/items/170c1a8eb364165faf5a)