Power Automate でSharePoint Listsの選択肢型の列を追加する方法

# やりたいこと
表題の通りですが、SharePointListsへ選択肢型の列を追加する処理をPower Automateで自動化したい、と同僚に相談されたので実行方法をご共有します。~~それいつ使うん？~~

# 実装
Power AutomateのSharepointのアクションには「Listsに列を追加する」という項目は<strong>ありません。</strong>そりゃそうか！

と、いうわけで、「SharePointにHTTP要求を送信します」というアクションを使用します。
やりたい処理を行えるアクションがない場合は、

①他の処理を組み合わせて間接的に実現する
②「〇〇にHTTPを～」というような、「HTTP」と記載のあるアクションで実現する

上記2つの方針を検討しましょう。

:::note info
Teamsには<strong>「Microsoft Graph HTTP 要求を送信する」</strong>、
Outlookには<strong>「HTTP 要求を送信します」</strong>というアクションがあります。
:::
今回は②のほうが良さそうなのでこちらで行きます。
「SharePoint に HTTP要求を送信します」アクションを追加したら、設定しないといけない項目（パラメータ）がたくさん出てきますね。



<strong>1. サイトのアドレス</strong>
こちらにはどのSharePointサイトにあるListsか？を指定します。ドロップダウンを選択すると選択できるSharePointサイトが表示されるので、目的のListsがあるサイトを選択しましょう。
私の場合は「【All Blue】技術 - 検証開発用プライベートチャネル」です。

<strong>2. 方法</strong>
「POST」を選択してください。「方法」と書いてありますがプログラミング界隈では「メソッド」といいます。日本語化されて余計わかりづらくなっているのはご愛嬌。メソッド（方法）というのは、HTTP要求の送信先（サーバー）に対してどんな操作をしてほしいのか？を指定するものです。<table>
  <caption><strong>メソッドの種類と説明</Strong></caption>
  <thead>
    <tr>
      <th>メソッド</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> GET </td> <td>サーバーからデータを取得するための要求です</td>
  </tr>
  <tr>
    <td> POST </td> <td>サーバーにデータを送信して、新しいリソースを作成したり、既存のプロセスを実行するために使用されます</td>
  </tr>
  <tr>
    <td> PATCH </td> <td>既存のリソースに対して、部分的な変更や更新を行うために使用されます</td>
  </tr>
  <tr>
    <td> PUT </td> <td>指定したリソースを、リクエスト本文に含まれる新しい内容で「完全に置き換える」ために使用されます</td>
  </tr>
  <tr>
    <td> DELETE </td> <td>指定したデータをサーバーから削除するために使用されます</td>
  </tr>
</table>今回は新しい列を追加するのでPOSTを選択したわけですね。内容が少し難しいですが、今回は読み飛ばしてしまっても大丈夫です。

<strong>3.URI</strong>
「Uniform Resource Identifier」のことで、
インターネット上のリソース（ウェブページやファイルなど）を一意に識別するための文字列です。
Sharepointサイトまでは指定しましたが、SharePointサイトの何に対してHTTP要求を送信するのか？までは指定していませんので、SharePoint サイトを指定しないといけません。
以下の文字列を入力しましょう。
```
_api/web/lists/getbytitle('サイトの名前')/fields
```

「サイトの名前」のところに選択肢型の列を追加したいSharePointサイトの名前を記入します。

:::note warn
シングルクォート「''」は消さないでください。
:::

私の場合は「test」というSharePointサイトを作っていて、ここに追加したいので「site」という文字列を記入しました。

```
_api/web/lists/getbytitle('test')/fields
```
4\. ヘッダー(Header)
HTTPヘッダーというものですね。HTTPヘッダーとは、クライアント（この場合Power Automate）とサーバー（この場合SharePoint）の間でデータをやり取りする際に、追加の情報を提供するためのデータです。Power AutomateでHTTP要求を送信する際、適切なヘッダーを設定することで、リクエストの内容を明確にし、サーバーに正しく処理させる ことができます。今回は、

<strong>Accept
Content-Type</strong>

この二つの追加情報をサーバーに送りますので、以下の文字列を入力しましょう。

`Accept` : `application/json;odata=verbose`
`Contat-Type` : `application/json;odata=verbose`

5\. ボディ(Body)
```JSON
{
  "__metadata": { "type": "SP.FieldChoice" },
  "Title": "ここに追加する列の表示名を入力します！！",
  "FieldTypeKind": 6,
  "Required": false,
  "EnforceUniqueValues": false,
  "Choices": {
    "results": [
      "選択肢1を入力します！",
      "選択肢2を入力します！",
      "選択肢3を入力します！"
    ]
  }
}
```

"Title"の "ここに追加する列の表示名を入力します！！"の部分に列の表示名を、
"results"の"選択肢1を入力します！"、"選択肢2を入力します！"、"選択肢3を入力します！"に選択肢として追加したい選択肢のテキストを入力します。

ちなみに、4つ以上の選択肢を追加したい場合は、"選択肢3を入力します"のあとにカンマ「,」をつけてから選択肢4の値を入力して、ダブルクォーテーションで囲みましょう。

選択肢1、2、3などは最後にカンマ「,」をつけ、最後の選択肢のみカンマ無しで作成します。
選択肢が5個の場合は5個目の選択肢のみ、10個の場合は10個目の選択肢だけカンマ無しで記載するわけですね。

```JSON
{
  "__metadata": { "type": "SP.FieldChoice" },
  "Title": "ここに追加する列の表示名を入力します！！",
  "FieldTypeKind": 6,
  "Required": false,
  "EnforceUniqueValues": false,
  "Choices": {
    "results": [
      "選択肢1を入力します！",
      "選択肢2を入力します！",
      "選択肢3を入力します！",
      "選択肢4を入力します！",
      "選択肢5を入力します！"
    ]
  }
}
```
こんなかんじ。選択肢が5個になったので選択肢3、4の値を囲っているダブルクォーテーション「""」の後ろにカンマ「,」をつけて、最後の選択肢5だけカンマ「,」をつけません。今回はテストなので選択肢は3つのままでいきます。

# 実行
これですべてのパラメータの設定が完了しました。私の場合の設定項目はこんなかんじ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939914/27e4c904-f0d9-4314-a881-a2e9de412364.png)

ではテストで実行してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939914/c5b81d1a-312a-420d-b3b8-d3a6d9700fe9.png)

成功しました！Listsのほうはどうなっているかというと・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939914/a555ba07-f594-4f90-977f-2dd24625fd61.png)

非表示になっている列の中に「ここに追加する列の表示名を入力します！！！」という名前の列がありますね！
ちなみにこれ、もう一回実行したら同じ表示名の列が追加されるのかしら？ エラーになるのかしら？ と疑問に思ったのでもう一回実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939914/a720c92a-2d9e-4e7d-bdd2-f97576bdc15e.png)

2回目も成功しましたね。

Listsの詳細設定画面でも、同じ表示名の列ができているのを確認できました。列の内部名は自動で変えてくれるみたいですね。

<strong>が！！！</strong>
Listsのレコード一覧画面でおなじ表示名の列を表示しようとしたところ、1列分しか表示されていません！！挙動がおかしなことになってしまってますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939914/d0c448fc-e385-43c2-8026-0e9cd70695c5.png)

既に表示している列の名前を「ここに追加する列の表示名を入力します！！！<strong>1</strong>」に変更したところ、2つとも列が表示できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939914/5d4e496f-bddc-4dcc-923c-bb84758defad.png)

SharePoint に HTTP要求を送信するアクションで列を追加する場合は、表示名を重複させないように注意して実行する必要がありますね。

SharePoint ListsはPower Automateでフローを作るうえでよく自動化対象となるツールですので、こういったListsの仕様も把握しておくとよいですね。