SharePoint REST APIを使ってみる

[Microsoft 365の活用ネタのまとめに戻る](https://qiita.com/Keiji_otsubo/items/5ddec87d5f1fd4e9f4af)


# 困っていること...

住所変更届というリストを作成して承認申請を行うために、承認申請リストを作成します。
承認申請リストは作成されたら承認のフローが流れるように設定しています。

今回は住所変更届以外も承認申請のワークフローを作りたいので、承認申請部分は共通化したいと考えています。
困ったのは承認申請自体のステータスは承認申請リストの中で項目更新アクションを使えば行えました。
ただ、大本の住所変届けリストをタイムリーに更新できないんですよね。

承認申請リストには住所変更届リストのリスト名とIdを持たせているので、これを使って項目の更新アクションを設定してもうまくいかないですね。

承認申請リストのカラムにあるパラメータをセットすると、住所変更届リストのカラムを取得できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5472cafd-f82d-7551-32da-a294965cb320.png)

リスト名を選択リストから選ぶと住所変更届リストのカラムを表示できるんですが...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3317135a-4f1d-c76e-6b1f-fcf515e2da6c.png)



SharePoint REST APIを使うしかないかなぁ。

+ [SharePoint REST エンドポイントを使用して基本的な操作を完了する](https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/complete-basic-operations-using-sharepoint-rest-endpoints)


SharePointでは、 POST を使用してリストやサイトなどのエンティティを作成します。 SharePoint REST サービスでは、オブジェクトの定義を含んだ POST コマンドの、コレクションを表すエンドポイントへの送信がサポートされます。 たとえば、新しいリスト オブジェクトの定義を ATOM 形式で含んだ POST コマンドを次の URL に送信して SharePoint リストを作成することができます。

```
http://<site url>/_api/web/lists
```

POST 操作では、必須ではないプロパティはすべて既定値に設定されます。 POST 操作の一部として読み取り専用プロパティを設定すると、サービスによって例外が返されます。

既存の SharePoint オブジェクトを更新する場合は、PUT 操作と MERGE 操作を使用します。 オブジェクト プロパティの set 操作を表すサービス エンドポイントは、 PUT 要求と MERGE 要求の両方をサポートします。 プロパティを明示的に設定しなくても、現在のプロパティが保持されます。 しかし、PUT コマンドの場合、明示的に設定しないプロパティについては既定のプロパティが設定されます。 さらに、HTTP PUT コマンドを使用したオブジェクトの更新では、必須のプロパティの指定が全部揃っていないと REST サービスから例外が返されます。

以下のエンドポイントを使って呼び出してみましたが、404エラーですね。


```
https://{{targetHost}}/_api/web/lists/GetByTitle('Test list')/items(1)
```

display name? もしかして、日本語の表示名を使う？

What is the **display name** of your list(Not the name in the url of list)?? in

https://sharepoint.stackexchange.com/questions/255424/sharepoint-rest-getting-error-404


日本語のラベルを使ったら404は解消です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8ccb9752-c1f8-3135-dc43-dc57f5d41323.png)

アイテムのGUIDを指定してもできるかと思ったけど、404エラーになりますね。これって何だろう。
仕方がないので諦めて、リストの表示名とIdを使った方法にしようか... しかしこれでうかつに表示名を変更できなくなりそうです。

```
_api/web/lists(guid 'xxxxd19-2902-460d-8360-22629ee9ed3d')
```

# リストを更新してみる

ヘッダを入力してないから？


リターンコード : 412

:::note alert
要求 ETag 値 '' がオブジェクトの ETag 値 '"xxxxxfd3-f988-4699-9680-15b95b99c803,1"' と一致しません。
:::

ここまでヘッダを入力してみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1fa7646d-3a7d-0fc1-f353-afc729a31ced.png)

https://qiita.com/mizukyf/items/4b6402799fbad616b7e2

{etag or *}に変更したら

リターンコード : 412

:::note alert
要求 ETag 値 '{etag or *}' がオブジェクトの ETag 値 '"xxxxxfd3-f988-4699-9680-15b95b99c803,1"' と一致しません。
:::


リターンコード : 400

:::note alert
プロパティ '__metadata' は型 'SP.Data.019ApprovalListItem' に存在しません。型で定義されているプロパティ名のみ使用してください。
:::

X-RequestDigestは必須みたい？

以下は、サイト名をセットするみたい。固定じゃない。

```
https://<<サイト名>>/_api/contextinfo
```

SharePoint エンティティを作成、更新、削除するときのもう 1 つの重要な考慮事項は、これらの要求の認証に OAuth を使用していない場合、これらの処理にサーバーの要求フォーム ダイジェスト値が X-RequestDigest ヘッダーの値として必要であることです。 この値を取得するには、 に対して本文が空の http://<site url>/_api/contextinfo 要求を実行し、 d:FormDigestValue エンドポイントが返す XML の ノードの値を抽出します。 

https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/complete-basic-operations-using-sharepoint-rest-endpoints


しかし、エラーは消えないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/424587e0-fbc3-1140-a0f4-fa5ac3bbf845.png)


https://itc-engineering-blog.netlify.app/blogs/powerautomate-odata-batch

このヘッダにしたら、無事更新できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e4fff76f-f9b4-0775-3989-c45bdc8dfb6d.png)

### まとめ

以下を見ながら設定したのですが、微妙に違いましたね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/26a711df-3efc-3ca3-f909-f260f5270b89.png)

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

|キー|値|
|:----------------|:---------------------|
|Accept|application/json|
|Content-Type|application/json;odata=verbose|
|If-Match|*|
|X-RequestDigest|https://<<サイト名>>/_api/contextinfo
|X-HTTP-Method|MERGE|


```Json
{"__metadata":{"type":"SP.Data.019ApprovalListItem"},"status":"承認"}
```


SharePoint のアイテムの更新をリスト名とIdを使って行うにはこの方法しかないのかなぁ。用意されているアクションではできないですね。どうもSharePoint は好きになれません。ただ今回はAPIなので気分的にやってみたくなったけど... 本当はSharePoint は使いたくないですね。よく分からないです。

違うフローにもこの設定を追加した時に400エラーになりましたが、ヘッダを間違えていました。400エラーの時はヘッダをチェックするのがいいと思います。


# インスタントクラウドフロー で起動したアイテムのIdが取得できるのか？

このように起動させた場合にidを取得できるのかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/57b6e494-7c86-acae-2995-edfb254599fb.png)

Idが取得できますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/55318841-62b1-e084-6390-f206a7fcc20f.png)

リストを指定しているので、他のリストには出ないということは、これは動的には設定できないようだな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1b612deb-4021-0eed-afcd-453c2b6d8a46.png)