SharePointフォームカスタマイズ#1 -Person列の既定値を上司に設定-

PowerAppsを利用する状況の中には、これまでInfoPathを利用してSharePointのフォームカスタマイズを行っていて、SharePoint Onlineでも同様にフォームをカスタマイズしたいという場合があると思われます。
これから数回にわけて、SharePoint OnlineのフォームをPowerAppsを利用してカスタマイズする方法を記載します。
第一回は、Person列の既定値の変更です。今回は承認依頼のような状況を例に、新規作成時の既定値を作成者の上司に設定する方法を解説します。

# 準備
## SharePoint リスト
今回利用するSharePointリストは以下のように、タイトル列とPerson or Group列の２つだけを有するものとします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/251020a9-8925-7c34-ef79-197ed688a526.png)

このPerson or Group列 (以下Person列)に対して既定値を設定します。
何もカスタマイズしていない状態では、すべてのユーザーが選択対象で、既定値は設定できません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/59057f89-e1bc-fe10-782d-bcbe81878c69.png)

## SharePointフォームカスタマイズ
PowerAppsを利用してフォームをカスタマイズするには、リストのメニューにある[PowerApps]から[Customize forms]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/1be34ea3-b607-4e0c-dc7f-22b746897a46.png)

PowerApps studioに移動し、フォームの編集画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/a4a9aece-c16e-d075-45e7-4c820607a42f.png)
今回はPerson列 (Approver)をカスタマイズしますが、まずはPerson列を含んでいるパーツ(DataCard) のロック解除を行います。これを行わないとラベルの追加やプロパティの変更ができません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/4b470569-766c-94b2-ec68-a94248736fe9.png)

## Office365 Usersコネクターの追加
今回の目的は**アイテム作成者の上司**を既定にセットすることです。この**XXの上司**を取得するには、別途Office 365 Usersコネクターをアプリ (カスタムフォーム) に追加する必要があります。
[View]メニュー → [Data sources] → [+Add data source] → [Office 365 Users]を選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/35d529ca-f1a1-cd76-bc9c-0f2bebbde4d8.png)
以上で、Office 365 Usersコネクターに用意された機能が利用できるようになりました。

# フォームカスタマイズ
実際にフォームをカスタマイズしていきます。やることは以下の通りです。

1. コンボボックスの表示対象 (Items) を Office365Users.SearchUserに変更
2. コンボボックスの既定値 (DefaultSelectedItems) をManagerに設定 (ただし新規作成時のみ)
3. Person列に対応するDataCardのUpdateプロパティを、SharePointリストのPerson列用に修正

## 表示対象の変更 (Office365Users.SearchUser)
Person列に対応するDataCardには*DataCardValueX*という名前のコンボボックスが含まれています。
このコンボボックスに表示される対象は、カスタマイズなしの場合、```Choices(SharePointリスト名.列名)```となっています。これを以下のように変更します。

```DataCardValue.Items
Office365Users.SearchUser({searchTerm:DataCardValue.SearchText,top:10})
```
「DataCardValueの検索テキストに入力された値をもとに、全ユーザーから該当者を検索し、上位10件を表示する」という設定です。
入力後、合わせてコンボボックスの候補が表示される部分のレイアウト変更、検索対象の設定を行います。
ここでは、候補者のDisplayNameとUserPrincipalNameを表示し、DisplayNameでの検索としています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/16b26cdd-6dad-6ae7-0f25-bb9d1d80f9fc.png)

これでこのコンボボックスは、もとの設定からOffice365 Usersコネクターを利用したユーザー検索ボックスに変わりました。

## 新規作成時の既定値設定
新規作成時の既定値を入力者の上司に設定します。
Office365 Usersコネクターでは、上司を取得する関数が用意されています。
```Office365Users.ManagerV2()```これを利用します。括弧内には、上司を取得する際のユーザー情報を入力します。(今回の場合は入力者)
既定値の設定は、コンボボックスのDefaultSelectedItemsプロパティに行います。

```DataCardValue.DefaultSelectedItems
If(SharePointForm1.Mode=FormMode.New,  //フォームのモードが新規作成なら
  Office365Users.ManagerV2(User().Email), //利用者のManagerを設定
  Parent.Default //それ以外の場合にはリストで選択されたアイテムを表示
)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/fbdd7e5c-698f-ea01-f50c-e4b86006a540.png)

これで既定値が設定されるようになりました。
※DataCardValueのItemsを変更せずに、DefaultSelectedItemsだけ変更するとエラーになります。

一度フォームを保存してSharePointリストで確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/0d5070bb-2698-3557-339e-b8766361c8e4.png)
ここまでの設定だけでも、入力者の上司が既定値に設定されるようになります。
(私の上司は "hotel contoso"という設定です)
しかし、データを保存すると、Person列が空の状態で保存されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/cebffe7d-a4bf-4ade-b2c7-32c5e4e64374.png)

## データ保存形式をSharePointリストに合わせる
上記の現象は、「Office365 Usersコネクターで取得したアカウント情報」と「SharePointリスト上のPerson列に必要な情報」が食い違うために起こります。
これを解消するために以下のように、DataCardのUpdateプロパティを変更します。

```DataCard.Update
{'@odata.type':"#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
   Claims:"i:0#.f|membership|"&DataCardValue.Selected.UserPrincipalName,
   DisplayName:DataCardValue2.Selected.DisplayName
}
```
ほとんどおまじないのように見えますが、重要なのは@odata.typeと、Claimsです。
これによって、「SharePointリストのPerson列の形式で、Claimsにあるユーザーを登録する」と宣言されたことになります。

再度テストデータを登録してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/537b3083-5f89-b76f-ed9f-95c5ab74095e.png)
今度は正しくPerson列にデータが登録されました。
念のため、表示も確認します。表示時の妥当性を確認するために、上司でないユーザーを登録したデータを表示してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202779/ead0f1d6-394c-d399-1472-e94376bc43c9.png)
結果、登録されているデータが正しく表示されていることがわかりました。

以上で、Person列の既定値変更カスタマイズは終了です。

#次回
次回は特定のセキュリティグループ/Office365グループに所属するメンバーから人を選択する方法を紹介します。