validateUpdateListItemを使ってみる

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



丸１日悩んだけど、結局はユーザ型のフィールドを修正することはできませんでしたね。
エラーは出てこないけど、フィールドは更新されないです。

+ [HTTP要求(REST)を使ってリストアイテムを更新する](https://qiita.com/Keiji_otsubo/items/56e461fd5af3d5adf95b)


かなりムカついたので他に調べてみるとvalidateUpdateListItemというのがあるらしい。

+ [Update single SharePoint column in Power Automate with HTTP request](https://tomriha.com/update-single-sharepoint-column-in-power-automate-with-http-request/)

よくわからんが、これを使ってみましたがやっぱりエラーです。

```Json
Body:
{
    "formValues":[
	{
	    "FieldName": "<FieldToUpdate>",
	    "FieldValue": "<ValueToUpdate>"
	}
    ]
}
```

:::note alert
書式が正しく設定された JSON ストリームではありません。
:::

さらに調べてみるとBodyの例がある

+ [Update file metadata with Rest API using ValidateUpdateListItem in SharePoint on-premises](https://techcommunity.microsoft.com/t5/microsoft-sharepoint-blog/update-file-metadata-with-rest-api-using-validateupdatelistitem/ba-p/1365682)

ん、Bodyがない？　考えたら、この入力部分ってBodyだから要らんのでは？


```Json
{
      "formValues": [
            {
                  "__metadata": { "type": "SP.ListItemFormUpdateValue" },
                  "FieldName": "Editor",
                  "FieldValue": "[{'Key':'i:0#.w|aaron@testdomain.com'}]"
            },
            {
                  "__metadata": { "type": "SP.ListItemFormUpdateValue" },
                  "FieldName": "Author",
                  "FieldValue": "[{'Key':'i:0#.w|aaron@testdomain.com'}]"
            }
      ],
      "bNewDocumentUpdate": true
}
```

前回もうまく更新できなかったユーザ型以外の項目でやってみます。おおお、更新できるな。


```Json
{
    "formValues":[
	{
	    "FieldName": "Title",
	    "FieldValue": "020出生届"
	},
	{
	    "FieldName": "status",
	    "FieldValue": "申請中"
	}
    ]
  }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c873fcb7-96a1-a9eb-acea-60a16173b1cc.png)



ではユーザ型を追加してみます。

```Json
    {
	    "FieldName": "Applicant",
	    "FieldValue": "{'Claims': 'i:0#.f|membership|xxxxx@yyyyy.co.jp'}"
	}
```


結果を見るとエラーになってないけど更新されてない


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7ec168ec-5098-dfaf-093e-20e659f038cf.png)


先程のサイトのユーザ型のところを見ると

```
"FieldValue": "[{'Key':'i:0#.w|aaron@testdomain.com'}]"
```

[]でくくっている。もしかして配列扱いの意味？またmembershipとかはないな。


```Json
	{
	    "FieldName": "Applicant",
	    "FieldValue": "[{'Claims': 'i:0#.f|xxxxx@yyyyy.co.jp'}]"
	}
```

しかしエラーですね。

:::note alert
"ErrorCode": -2146232832,
"ErrorMessage": "完全一致が見つかりませんでした。",
:::

先程のサイトを良く読んでみると... 英語なので見ただけで嫌気がさして読まないので気合と翻訳が必要です。

:::note
Both Editor and Author are People and Group (Person) field. According above blogs, you can set the Person field, like:

"[{'Key':'i:0#.f|membership|aaron@contoso.onmicrosoft.com'}]"

This works fine with SharePoint Online users. However, it does not work with SharePoint on-premises users, although no error returned from the method.

After some testing, I found that for SharePoint on-premises users, you need to set the Persons field like below:

"[{'Key':'i:0#.w|aaron@testdomain.com'}]"

編集者と作成者はどちらも人物およびグループ (人) フィールドです。上記のブログによると、次のように Person フィールドを設定できます。

"[{'Key':'i:0#.f|メンバーシップ|aaron@contoso.onmicrosoft.com'}]"

これは **SharePoint Online ユーザーには問題なく機能します。** ただし、メソッドからエラーは返されませんが、SharePoint オンプレミス ユーザーでは機能しません。

いくつかのテストの結果、SharePoint オンプレミス ユーザーの場合は、次のように [個人] フィールドを設定する必要があることがわかりました。

"[{'Key':'i:0#.w|aaron@testdomain.com'}]"
:::

えっ、SharePoint Onlineではmembershipが必要ってこと？
ついでに　ClaimsをKeyに変えてみるか

```Json
	{
	    "FieldName": "Applicant",
	    "FieldValue": "[{'Key': 'i:0#.f|membership|xxxxx@yyyyy.co.jp'}]"
	}
```

おおお、今度は更新できましたね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/23f08275-026c-084f-ab3d-8dcb3a511a79.png)


# さまざまなフィールドタイプの JSON コード

https://sharepointcass.com/2020/05/14/programmatically-updating-sharepoint-list-properties-in-power-automate-without-affecting-the-version-history/


# そもそもこれは何のためにある？


+ [トリガーや履歴アクションを使用せずに PowerAutomate を使用して SharePoint アイテムを更新する方法](https://www.reddit.com/r/MicrosoftFlow/comments/18zkpuv/how_to_update_sharepoint_items_with_powerautomate/)



Power Automate を使用して SharePoint を最適化する: SharePoint の REST API には、バージョン履歴に影響を与えることなくリスト アイテムのシステム更新を可能にするvalidateUpdateListItem エンドポイントが備わっています。これは、特に変更を追跡する必要がない場合に、クリーンなバージョン履歴を維持するのに役立ちます。

不必要なバージョン履歴エントリを回避する: bNewDocumentUpdateを true に設定してvalidateUpdateListItem を使用すると、新しいバージョン履歴エントリの生成が停止します。これは、あらゆる小さな変更を追跡することが現実的ではない、大規模なリストやライブラリを管理する場合に有利です。

よりクリーンなバージョン履歴: validateUpdateListItem エンドポイントは、バージョン履歴に文書化する必要のないマイナーな技術的更新や管理上の更新が乱雑にならないようにすることで、合理化されたバージョン履歴のメンテナンスを容易にします。


# やっぱり使えないですね。

日付を追加したら機能しません。


```
FieldValue":  "@{formatDateTime(utcNow(),'yyyy/mm/dd')}
```

これを使ったらこんな日付になるなぁ。　これってまともなシステムとは思えないです。
よくこんなツールで問題なく使えるって感心しますよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d8c42dcd-5918-e774-fa76-7ba77d5b92d8.png)


```
   {
          "ErrorCode": -2146232832,
          "ErrorMessage": "2012/02/23 の形式で日付を入力してください。",
          "FieldName": "ApplicationDate",
          "FieldValue": "2024/31/27",
          "HasException": true,
          "ItemId": 23

```

強制的にハンドで記入したら更新できましたね。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d6b2c460-fe09-df2b-8b19-7f2527fd30c3.png)

mmは分か？


```
@{formatDateTime(utcNow(),'yyyy/MM/dd')}
```

MMが日付だな。