SharePoint リストの選択肢列をPower Automateで操作する

# はじめに
リストの選択肢を自動的に増やしたり減らしたりしたいときの方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/3feae49a-ee15-135a-3130-4f719a724b11.png)

ここを編集したい、というのが本記事の内容です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/bbe659bb-0e83-31d3-5419-b0d2cf04dfb4.png)

:::note info
SharePoint リストはよく、簡易データベースとしてPower Apps のデータソースとして用いられることもありますが、普通、選択式の項目を増減しようと思うと、もう一つ選択肢のためだけのリストを作ってリレーションするのが一般的です。
この方法を使うと、1つのリストだけで完結することができるので、テーブル構造がシンプルになる可能性があります。
:::

# SharePoint REST API
方法としては、API を使います。
SharePoint コネクタには、API を使用するためのアクションが標準で用意されておりますので、プレミアムライセンスなしで利用することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/81c9aa28-84a4-1578-41a3-3d0f08ce099f.png)

https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/working-with-lists-and-list-items-with-rest

ただ、API を使う分、フローの難易度が高くなりますので、ここでは順を追って説明していきます。

## リストを取得する
選択肢を操作するにはまず、選択肢がどのように登録されているかを知る必要があります。
直接選択肢の情報を取得する前に、まずはリスト自体にアクセスしてみましょう。

parameterは以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e2f971f2-37a8-24cf-c659-2ad6fdbaa878.png)

|parameter|value|
|:---|:---|
|サイトのアドレス|リストを作成したサイトのホームURL|
|方法|GET|
|URI|_api/web/lists/getbytitle('{リストの名前}')|

実行結果はこのようになります。
この結果のうち、`Fields`が列の定義ですので、次はここにアクセスしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/91340656-ff39-6a02-b6de-e02c8a9e88aa.png)

## 列の定義を取得する
リストの情報を取得する方法に加えて、1階層潜って`Fields`(列)にアクセスします。
先ほどのURIの末尾に、`/Fields`を加えるだけでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c22cce8b-6b25-9626-0aa4-45ac124a6b64.png)

|parameter|value|
|:---|:---|
|サイトのアドレス|リストを作成したサイトのホームURL|
|方法|GET|
|URI|_api/web/lists/getbytitle('{リストの名前}')/**Fields**|

結果はこのようになります。
結果から、次にアクセスしたい選択肢列を探しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ba9262db-32f3-fe0f-e5f1-945d9ceba555.png)

## 特定の列の定義を取得する
先ほど取得したすべての列の定義のうち、アクセスしたい特定の列（選択肢列）の情報にアクセスします。

検索して探した列定義の中には、メタ情報として、その特定の列にアクセスするためのURIが記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/cb5e2b14-4503-5e73-80b7-c9d1e9873101.png)

```uri:__metadata/uri
https://v45dm.sharepoint.com/sites/ksgiksg/_api/Web/Lists(guid'afbadf6e-924c-4cd2-ac9d-acb76a5ecc28')/Fields(guid'40b70f91-91ef-4293-8c45-d55ff0960a55')
```

ここで確認したいのは、`Fields(guid'`の後ろのIDです。（ここでは`40b70f91-91ef-4293-8c45-d55ff0960a55`）
IDを直接記載しているプロパティもあるので、どちらからでも確認ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0d371aae-bec9-8382-dbf9-f33396ed4eb9.png)

IDを確認したら、parameterを以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0d483b54-9969-aa71-aae7-41e5e9ecf926.png)

|parameter|value|
|:---|:---|
|サイトのアドレス|リストを作成したサイトのホームURL|
|方法|GET|
|URI|_api/web/lists/getbytitle('{リストの名前}')/Fields **(guid'{列のID}')**|

:::note warn
IDの前後に`'`(シングルクォーテーション)が必要なので注意
:::

結果はこのようになります。
やっと選択肢が取得できましたね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0c6c282b-952a-0bc8-7c2f-e3cb8fe4e2d3.png)

## 選択肢を取得する
選択肢の取得に関しては、前項でもうできてしまったので、ここは必要ないのですが、選択肢のみの情報に絞って取得することもできます。
URI末尾に`/Choices`を加えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/880f5fbb-c3ee-6d07-4d1d-c56ee249b9b6.png)

|parameter|value|
|:---|:---|
|サイトのアドレス|リストを作成したサイトのホームURL|
|方法|GET|
|URI|_api/web/lists/getbytitle('{リストの名前}')/Fields(guid'{列のID}')**/Choices**|

結果は先ほどよりシンプルで、このようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/17bc6a6a-f406-9c35-abc2-a1b4518d14a8.png)

## 選択肢を更新する
ようやく本題です。
取得には`GET`を使いましたが、更新には`PATCH`を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f48881ad-964b-4130-4fb6-7356bb0fb6fc.png)

また、更新するための情報(ボディ)やヘッダーも必要になります。
※ここでは「バッタ」を選択肢に追加した情報を入力しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e015d6fa-dbc7-293e-beed-ebc7ac8c54d6.png)

:::note
ボディとヘッダーを設定するには、アクション下部の`すべてを表示`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/151f8125-7248-c8e4-e0c9-89e18da91bd4.png)
:::
|parameter|value|
|:---|:---|
|サイトのアドレス|リストを作成したサイトのホームURL|
|方法|PATCH|
|URI|_api/web/lists/getbytitle('{リストの名前}')/Fields(guid'{列のID}')|
|ヘッダー|"accept":"application/json;odata=verbose"<br>"Content-Type":"application/json;odata=verbose"|

```json:ボディ
{
	"__metadata": {
		"type": "SP.FieldChoice"
	},
	"Choices": {
		"__metadata": {
			"type": "Collection(Edm.String)"
		},
		"results": [
			"ライオン",
			"トラ",
			"チーター",
			"バッタ"
		]
	}
}
```

実行すると、このようにリスト側で選択肢が追加されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/77599785-4711-d504-c836-f103f36a5c9f.png)

# おわりに
ちょっと苦手で敬遠していたSharePoint REST API に挑戦してみました。
リストの定義自体を編集できると、いろいろとできることが広がりそうです。
最近できるようになったSharePoint リストから直接フォームを作る機能と組み合わせると、Microsoft Forms ではできなかったことができそうです！

https://techcommunity.microsoft.com/t5/microsoft-sharepoint-blog/collect-information-like-a-pro-new-microsoft-lists-forms/ba-p/4086659