1. 記事一覧 >
  2. ブログ記事
Power Automate
category logo

Power Automate & SharePoint OData $batchクエリでまとめて追加・更新・削除

(更新) (公開)

はじめに

別記事「Power Automate & Share Point の 5000 件問題を攻略した」にて、5000 件を超えるデータについて、5000 件問題回避フロー作成に取り組みました。「5000 件問題フリーのフロー」は、参照するだけで終わりましたが、応用して、5000 件を超えるデータの追加(作成)・更新・削除が可能です。
ですが...動作が遅いのと、ループの数が要求数の上限(ライセンスごとに決まっているアクションの実行回数等の上限)を超過する可能性が高まります。
Microsoft SharePoint Online の REST/OData API で $batch クエリ オプションを使用すると、1回のアクションでまとめて追加(作成)・更新・削除が可能になります。


【例】
$batch クエリ対応前項目の作成 アクションを 100 回実行して、SharePoint リストに 100 行追加
$batch クエリ対応後SharePoint に HTTP 要求を送信します アクションを 1 回実行して、SharePoint リストに 100 行追加


今回、SharePoint に HTTP 要求を送信します アクションを使用して、まとめて追加(作成)・更新・削除のフローを作成していきたいと思います。

2023 年 9 月現在の状況を元に説明しています。


SharePoint リスト

SharePoint リストは、以下のようにシンプルなものとします。

内部列名表示列名
Titleタイトル一行テキスト(細かい設定はデフォルトのまま)
TestValueテスト値数値(細かい設定はデフォルトのまま)

とりあえず、テスト用に 2 リスト作成して、2 レコードデータを入れておきます。


● リスト:datalist

タイトルテスト値
A1
A2

リスト:datalist


● リスト:datalist2

タイトルテスト値
B1001
B1002

リスト:datalist2


OData バッチリクエスト基本

OData の仕様自体は、Power Automate だとか SharePoint に限った話ではなく、仕様に準拠したシステムは沢山あります。

ここでの説明は、Power Automate - SharePoint 間の範囲での説明になります。

今回利用するテクニック "SharePoint REST/OData API に対して $batch クエリ オプションを使用"(公式サイト「REST API によりバッチ要求を発行する」より) には、OData バッチリクエストの仕様が利用されています。


バッチ要求は、基本的に以下のようなリクエストになります。

リクエスト内容全体
POST https://<SharePointサイト>/_api/$batch HTTP/1.1
Host: <SharePointサイトドメイン>
X-RequestDigest: <認証トークン>
Content-Type: multipart/mixed; boundary=batch_<ユニークID>

<バッチリクエスト本体>

<SharePointサイト>:サイトのホスト名/サイト名 です。(例:https://example.sharepoint.com/sites/examplesite


<SharePointサイトドメイン>:サイトのホスト名のみです。(例:example.sharepoint.com


<認証トークン>:不正アクセス防止の操作許可トークンです。今回の場合、SharePoint に HTTP 要求を送信します アクションで自動的に付与されます。(フローを動かす人で許可されています。)


<ユニークID><バッチリクエスト本体> でバッチリクエストの開始と停止を宣言するために使われる ID です。通常、GUID が使われますが、GUID である必要はないようです。

GUID(Globally Unique Identifier、グローバル一意識別子) とは、データを一意に識別するために用いられる識別子のことです。例:3f2504e0-4f89-11d3-9a0c-0305e82c3301


<バッチリクエスト本体>:GET(データ参照)の場合、以下のようになります。

バッチリクエスト本体部分
--batch_<ユニークID>
Content-Type: application/http
Content-Transfer-Encoding: binary

GET https://<SharePointサイト>/_api/web/lists/getbytitle('<リスト名>')/items?$select=<リスト列名> HTTP/1.1
Host: <SharePointサイトドメイン>
Accept: application/json;odata=verbose

--batch_<ユニークID>
Content-Type: application/http
...繰り返し

--batch_<ユニークID>:一つのリクエストの区切り線のようなものです。<ユニーク ID> は、先ほど出てきた <ユニーク ID> と同一のものを指定する必要があります。同一のものを指定しない場合、エラーにはならず、以下のようなレスポンスが返ってきます。

{
  "$content-type": "multipart/mixed; boundary=batchresponse_03f86433-d3df-4071-89ac-c61f1507bcfa",
  "$content": "LS1iYXRjaHJlc3BvbnNlXzAzZjg2NDMzLWQzZGYtNDA3MS04OWFjLWM2MWYxNTA3YmNmYS0tDQo="
}

$content の値は、base64 デコードすると、

--batchresponse_03f86433-d3df-4071-89ac-c61f1507bcfa--

です。


Content-Type: application/http:固定のおまじないです。無いと以下のように怒られます。
'Content-Type' ヘッダーがありません。'Content-Type' ヘッダーは、バッチ メッセージの MIME パートごとに指定する必要があります。


Content-Transfer-Encoding: binary:固定のおまじないです。無いと以下のように怒られます。
'Content-Transfer-Encoding' ヘッダーが見つからなかったか、無効なヘッダーが見つかりました。バッチ操作ごとに 'Content-Transfer-Encoding' ヘッダーを指定し、値を 'binary' にする必要があります。


GET ... HTTP/1.1:SharePoint リスト <リスト名> から <リスト列名> 列の値を全て取得します。何がしたいかによって、URL は変わります。(他のパターンの説明は割愛します。)


Host: <SharePointサイトドメイン>:サイトのホスト名のみの部分です。(例:example.sharepoint.com無くても動作しました。


Accept: application/json;odata=verbose:応答がメタデータを含む JSON になります。メタデータとは、以下のような情報です。(注意:あくまで一例で、リクエスト先や内容によって変わります。)

"__metadata": {
    "id": "86f77d51-7de6-4543-91f3-0e01270c612e",
    "uri": "https://example.sharepoint.com/sites/testsite/_api/Web/Lists(guid'3f2504e0-4f89-11d3-9a0c-0305e82c3301')/Items(6)",
    "etag": "\"2\"",
    "type": "SP.Data.DatalistListItem"
},

その他に、Accept: application/json;odata=nometadata があります。この場合、応答がメタデータを含まない JSON になります。あくまで一例で、リクエスト先や内容によって変わりますが、上記のように重要視しない情報が含まれている場合、
Accept: application/json;odata=nometadata
で良いと思います。
Accept: application/atom+xml
の場合は、応答が base64 エンコードされた XML になります。Accept: ... は、無くても動作しましたが、省略した場合、
Accept: application/atom+xml
になるようです。


上記は、GET(参照)の場合です。
POST(追加)、PATCH(更新)、DELETE(削除)の場合、<バッチリクエスト本体> に追加作法 Changeset ID が必要になります。


POST(追加)、PATCH(更新)、DELETE(削除)で追加作法 Changeset ID が無いと以下のように怒られます。
クエリ操作で無効な HTTP メソッド 'POST' が検出されました。クエリ操作では、HTTP メソッドとして 'GET' のみがサポートされます。


<バッチリクエスト本体>:POST(追加)、PATCH(更新)、DELETE(削除)の場合、以下のようになります。

バッチリクエスト本体
--batch_<ユニークID>
Content-Type: multipart/mixed; boundary="changeset_<Changeset ID>"

--changeset_<Changeset ID>
Content-Type: application/http
Content-Transfer-Encoding: binary

POST https://<SharePointサイト>/_api/web/lists/getbytitle('<SharePointリスト名>')/items HTTP/1.1
Content-Type: application/json;odata=nometadata

<データ>

--changeset_<Changeset ID>
Content-Type: application/http
...繰り返し

<Changeset ID>:GUID など、ユニークな ID を指定します。それならば、boundary=batch_<ユニークID><ユニークID> と同じで良いのでは?と思って、やってみたら、動きました。(ただし、変えた方がいいと思います。)


POST ... HTTP/1.1:更新の時は、PATCH、削除の時は、DELETE です。何がしたいかによって、URL は変わります。(上記の場合、<SharePoint リスト名> リストに <データ> を追加します。)


<データ>:今回のリストがターゲットの場合、{"Title":"A","TestValue":"1"} と書くと、1行追加されます。


なお、無しでも動作しましたが、バッチ要求の最後には、
--batch_<Changeset ID>--
--batch_<ユニークID>--
を付けるのが作法です。(先頭と末尾両方に -- です。)


1 アクションで 2 リストデータ取得

Power Automate SharePoint に HTTP 要求を送信します アクション を使って、2 つの SharePoint のリストからデータを取得します。


作成 アクションで、
入力guid()
により、BatchIDChangesetID 2つステップを追加します。

ChangesetID の方は、このセクションでは使用しません。

BatchID、ChangesetID


さらにステップを追加して、
SharePoint に HTTP 要求を送信します アクション
を追加します。

SharePoint に HTTP 要求を送信します


サイトのアドレス: データを取得したいリストが存在する SharePoint サイトを選択、もしくは、URL を直接入力します。


方法: POST を選択します。ここで、GET だと勘違いしそうですが、_api/$batch へのバッチリクエストを意図している場合、必ず、POSTです。


URI: _api/$batch 固定です。もちろん、バッチリクエストを意図していない場合、異なりますが、本記事では、バッチリクエストしかしないため、固定です。


ヘッダー 1: キーの入力:Content-Type、値の入力:multipart/mixed; boundary=batch_@{outputs('BatchID')} です。
値の入力のところの、@{outputs('BatchID')} の部分ですが、コピペしても良いですが、multipart/mixed; boundary=batch_ まで入力して、出力 の部分を選択しても良いです。

出力の部分を選択


ヘッダー 2: キーの入力:Expect、値の入力:100-continue です。「これから大きいデータを送りますよ。」というような意味です。


ボディ: 以下の内容を入力です。

ボディ
--batch_@{outputs('BatchID')}
Content-Type: application/http
Content-Transfer-Encoding: binary

GET https://example.sharepoint.com/sites/testsite/_api/web/lists/getbytitle('datalist')/items?$select=TestValue HTTP/1.1
Accept: application/json;odata=nometadata

--batch_@{outputs('BatchID')}
Content-Type: application/http
Content-Transfer-Encoding: binary

GET https://example.sharepoint.com/sites/testsite/_api/web/lists/getbytitle('datalist2')/items?$select=TestValue HTTP/1.1
Accept: application/json;odata=nometadata

--batch_@{outputs('BatchID')}--

これで、
・datalist リストから TestValue 列の値全てを取り出し。
・datalist2 リストから TestValue 列の値全てを取り出し。
2つの動作を一回で実行という意味になります。
Accept: application/json;odata=nometadata を指定しているため、メタデータを含まない JSON が返ります。


フロー全体像です。

GETフロー全体像


実行します。

GETフロー実行


成功しました!


出力全体は、以下です。

出力
{
  "$content-type": "multipart/mixed; boundary=batchresponse_ef822009-25f9-49c2-aef9-0ab5502dbb42",
  "$content": "LS1iYXRjaHJlc3BvbnNlX2VmODIyMDA5LTI1ZjktNDljMi1hZWY5LTBhYjU1MDJkYmI0Mg0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9odHRwDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCg0KSFRUUC8xLjEgMjAwIE9LDQpDT05URU5ULVRZUEU6IGFwcGxpY2F0aW9uL2pzb247b2RhdGE9bm9tZXRhZGF0YTtzdHJlYW1pbmc9dHJ1ZTtjaGFyc2V0PXV0Zi04DQoNCnsidmFsdWUiOlt7IlRlc3RWYWx1ZSI6MS4wfSx7IlRlc3RWYWx1ZSI6Mi4wfV19DQotLWJhdGNocmVzcG9uc2VfZWY4MjIwMDktMjVmOS00OWMyLWFlZjktMGFiNTUwMmRiYjQyDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2h0dHANCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeQ0KDQpIVFRQLzEuMSAyMDAgT0sNCkNPTlRFTlQtVFlQRTogYXBwbGljYXRpb24vanNvbjtvZGF0YT1ub21ldGFkYXRhO3N0cmVhbWluZz10cnVlO2NoYXJzZXQ9dXRmLTgNCg0KeyJ2YWx1ZSI6W3siVGVzdFZhbHVlIjoxMDAxLjB9LHsiVGVzdFZhbHVlIjoxMDAyLjB9XX0NCi0tYmF0Y2hyZXNwb25zZV9lZjgyMjAwOS0yNWY5LTQ5YzItYWVmOS0wYWI1NTAyZGJiNDItLQ0K",
  "$multipart": [
    {
      "headers": {
        "Content-Type": "application/http",
        "Content-Transfer-Encoding": "binary"
      },
      "body": {
        "$content-type": "application/http; msgtype=response",
        "$content": "SFRUUC8xLjEgMjAwIE9LDQpDT05URU5ULVRZUEU6IGFwcGxpY2F0aW9uL2pzb247b2RhdGE9bm9tZXRhZGF0YTtzdHJlYW1pbmc9dHJ1ZTtjaGFyc2V0PXV0Zi04DQoNCnsidmFsdWUiOlt7IlRlc3RWYWx1ZSI6MS4wfSx7IlRlc3RWYWx1ZSI6Mi4wfV19",
        "$applicationHttp": {
          "headers": {},
          "body": {
            "value": [
              {
                "TestValue": 1
              },
              {
                "TestValue": 2
              }
            ]
          },
          "statusCode": 200
        }
      }
    },
    {
      "headers": {
        "Content-Type": "application/http",
        "Content-Transfer-Encoding": "binary"
      },
      "body": {
        "$content-type": "application/http; msgtype=response",
        "$content": "SFRUUC8xLjEgMjAwIE9LDQpDT05URU5ULVRZUEU6IGFwcGxpY2F0aW9uL2pzb247b2RhdGE9bm9tZXRhZGF0YTtzdHJlYW1pbmc9dHJ1ZTtjaGFyc2V0PXV0Zi04DQoNCnsidmFsdWUiOlt7IlRlc3RWYWx1ZSI6MTAwMS4wfSx7IlRlc3RWYWx1ZSI6MTAwMi4wfV19",
        "$applicationHttp": {
          "headers": {},
          "body": {
            "value": [
              {
                "TestValue": 1001
              },
              {
                "TestValue": 1002
              }
            ]
          },
          "statusCode": 200
        }
      }
    }
  ]
}

base64 エンコードされているところをデコードすると、以下のような内容です。

$content
--batchresponse_ef822009-25f9-49c2-aef9-0ab5502dbb42
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 200 OK
CONTENT-TYPE: application/json;odata=nometadata;streaming=true;charset=utf-8

{"value":[{"TestValue":1.0},{"TestValue":2.0}]}
--batchresponse_ef822009-25f9-49c2-aef9-0ab5502dbb42
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 200 OK
CONTENT-TYPE: application/json;odata=nometadata;streaming=true;charset=utf-8

{"value":[{"TestValue":1001.0},{"TestValue":1002.0}]}
--batchresponse_ef822009-25f9-49c2-aef9-0ab5502dbb42--
$multipart[0].body.$content
HTTP/1.1 200 OK
CONTENT-TYPE: application/json;odata=nometadata;streaming=true;charset=utf-8

{"value":[{"TestValue":1.0},{"TestValue":2.0}]}
$multipart[1].body.$content
HTTP/1.1 200 OK
CONTENT-TYPE: application/json;odata=nometadata;streaming=true;charset=utf-8

{"value":[{"TestValue":1001.0},{"TestValue":1002.0}]}

成功しましたので、ついでに、
Content-Type: application/json;odata=nometadata

Content-Type: application/json;odata=verbose
にして、メタデータも含めた応答を見てみます。
リクエスト内容は、省略して、結果は、以下です。

出力
{
  "$content-type": "multipart/mixed; boundary=batchresponse_0eae2cdd-e204-4393-a7ee-ac7bd4f62e7f",
  "$content": "LS1iYXRjaHJlc3BvbnNlXzBlYWUyY2RkLWUyMDQtNDM5My1hN2VlLWFjN2JkNGY2MmU3Zg0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9odHRwDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCg0KSFRUUC8xLjEgMjAwIE9LDQpDT05URU5ULVRZUEU6IGFwcGxpY2F0aW9uL2pzb247b2RhdGE9dmVyYm9zZTtjaGFyc2V0PXV0Zi04DQoNCnsiZCI6eyJyZXN1bHRzIjpbeyJfX21ldGFkYXRhIjp7ImlkIjoiYjQ0ZjQ1YjMtNmZkMy00MzNhLTg5OTgtYzJhZTgzNjU1YWMxIiwidXJpIjoiaHR0cHM6Ly9leGFtcGxlLnNoYXJlcG9pbnQuY29tL3NpdGVzL3Rlc3RzaXRlL19hcGkvV2ViL0xpc3RzKGd1aWQnNjUxYWEyNmYtNTMzMi00NjYwLTk3ZGUtYzNmMzIxYmNmOGZjJykvSXRlbXMoNikiLCJldGFnIjoiXCIyXCIiLCJ0eXBlIjoiU1AuRGF0YS5EYXRhbGlzdExpc3RJdGVtIn0sIlRlc3RWYWx1ZSI6MX0seyJfX21ldGFkYXRhIjp7ImlkIjoiYjNjNjAzNzMtNDNiNC00Y2RkLTk3NTAtNGI5OTM4YzkwMzlmIiwidXJpIjoiaHR0cHM6Ly9leGFtcGxlLnNoYXJlcG9pbnQuY29tL3NpdGVzL3Rlc3RzaXRlL19hcGkvV2ViL0xpc3RzKGd1aWQnNjUxYWEyNmYtNTMzMi00NjYwLTk3ZGUtYzNmMzIxYmNmOGZjJykvSXRlbXMoNykiLCJldGFnIjoiXCIyXCIiLCJ0eXBlIjoiU1AuRGF0YS5EYXRhbGlzdExpc3RJdGVtIn0sIlRlc3RWYWx1ZSI6Mn1dfX0NCi0tYmF0Y2hyZXNwb25zZV8wZWFlMmNkZC1lMjA0LTQzOTMtYTdlZS1hYzdiZDRmNjJlN2YNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vaHR0cA0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5DQoNCkhUVFAvMS4xIDIwMCBPSw0KQ09OVEVOVC1UWVBFOiBhcHBsaWNhdGlvbi9qc29uO29kYXRhPXZlcmJvc2U7Y2hhcnNldD11dGYtOA0KDQp7ImQiOnsicmVzdWx0cyI6W3siX19tZXRhZGF0YSI6eyJpZCI6IjI5MDkxYTIyLTgyNzUtNGJjNS1hMjg0LWVlMjU3NzgyNzA0YyIsInVyaSI6Imh0dHBzOi8vZXhhbXBsZS5zaGFyZXBvaW50LmNvbS9zaXRlcy90ZXN0c2l0ZS9fYXBpL1dlYi9MaXN0cyhndWlkJ2QzZWFjZGJjLTk3NmMtNDcwNy1hN2FhLTZlZmU3ZmQ5YmMzYycpL0l0ZW1zKDEpIiwiZXRhZyI6IlwiMlwiIiwidHlwZSI6IlNQLkRhdGEuRGF0YWxpc3QyTGlzdEl0ZW0ifSwiVGVzdFZhbHVlIjoxMDAxfSx7Il9fbWV0YWRhdGEiOnsiaWQiOiIwMDc2OTJhYi1kODQxLTQ5MDUtYjAzNi1jOWM5NjFmYjVlNDIiLCJ1cmkiOiJodHRwczovL2V4YW1wbGUuc2hhcmVwb2ludC5jb20vc2l0ZXMvdGVzdHNpdGUvX2FwaS9XZWIvTGlzdHMoZ3VpZCdkM2VhY2RiYy05NzZjLTQ3MDctYTdhYS02ZWZlN2ZkOWJjM2MnKS9JdGVtcygyKSIsImV0YWciOiJcIjJcIiIsInR5cGUiOiJTUC5EYXRhLkRhdGFsaXN0Mkxpc3RJdGVtIn0sIlRlc3RWYWx1ZSI6MTAwMn1dfX0NCi0tYmF0Y2hyZXNwb25zZV8wZWFlMmNkZC1lMjA0LTQzOTMtYTdlZS1hYzdiZDRmNjJlN2YtLQ=",
  "$multipart": [
    {
      "headers": {
        "Content-Type": "application/http",
        "Content-Transfer-Encoding": "binary"
      },
      "body": {
        "$content-type": "application/http; msgtype=response",
        "$content": "SFRUUC8xLjEgMjAwIE9LDQpDT05URU5ULVRZUEU6IGFwcGxpY2F0aW9uL2pzb247b2RhdGE9dmVyYm9zZTtjaGFyc2V0PXV0Zi04DQoNCnsiZCI6eyJyZXN1bHRzIjpbeyJfX21ldGFkYXRhIjp7ImlkIjoiYjQ0ZjQ1YjMtNmZkMy00MzNhLTg5OTgtYzJhZTgzNjU1YWMxIiwidXJpIjoiaHR0cHM6Ly9leGFtcGxlLnNoYXJlcG9pbnQuY29tL3NpdGVzL3Rlc3RzaXRlL19hcGkvV2ViL0xpc3RzKGd1aWQnNjUxYWEyNmYtNTMzMi00NjYwLTk3ZGUtYzNmMzIxYmNmOGZjJykvSXRlbXMoNikiLCJldGFnIjoiXCIyXCIiLCJ0eXBlIjoiU1AuRGF0YS5EYXRhbGlzdExpc3RJdGVtIn0sIlRlc3RWYWx1ZSI6MX0seyJfX21ldGFkYXRhIjp7ImlkIjoiYjNjNjAzNzMtNDNiNC00Y2RkLTk3NTAtNGI5OTM4YzkwMzlmIiwidXJpIjoiaHR0cHM6Ly9leGFtcGxlLnNoYXJlcG9pbnQuY29tL3NpdGVzL3Rlc3RzaXRlL19hcGkvV2ViL0xpc3RzKGd1aWQnNjUxYWEyNmYtNTMzMi00NjYwLTk3ZGUtYzNmMzIxYmNmOGZjJykvSXRlbXMoNykiLCJldGFnIjoiXCIyXCIiLCJ0eXBlIjoiU1AuRGF0YS5EYXRhbGlzdExpc3RJdGVtIn0sIlRlc3RWYWx1ZSI6Mn1dfX0=",
        "$applicationHttp": {
          "headers": {},
          "body": {
            "d": {
              "results": [
                {
                  "__metadata": {
                    "id": "b44f45b3-6fd3-433a-8998-c2ae83655ac1",
                    "uri": "https://example.sharepoint.com/sites/testsite/_api/Web/Lists(guid'651aa26f-5332-4660-97de-c3f321bcf8fc')/Items(6)",
                    "etag": "\"2\"",
                    "type": "SP.Data.DatalistListItem"
                  },
                  "TestValue": 1
                },
                {
                  "__metadata": {
                    "id": "b3c60373-43b4-4cdd-9750-4b9938c9039f",
                    "uri": "https://example.sharepoint.com/sites/testsite/_api/Web/Lists(guid'651aa26f-5332-4660-97de-c3f321bcf8fc')/Items(7)",
                    "etag": "\"2\"",
                    "type": "SP.Data.DatalistListItem"
                  },
                  "TestValue": 2
                }
              ]
            }
          },
          "statusCode": 200
        }
      }
    },
    {
      "headers": {
        "Content-Type": "application/http",
        "Content-Transfer-Encoding": "binary"
      },
      "body": {
        "$content-type": "application/http; msgtype=response",
        "$content": "SFRUUC8xLjEgMjAwIE9LDQpDT05URU5ULVRZUEU6IGFwcGxpY2F0aW9uL2pzb247b2RhdGE9dmVyYm9zZTtjaGFyc2V0PXV0Zi04DQoNCnsiZCI6eyJyZXN1bHRzIjpbeyJfX21ldGFkYXRhIjp7ImlkIjoiMjkwOTFhMjItODI3NS00YmM1LWEyODQtZWUyNTc3ODI3MDRjIiwidXJpIjoiaHR0cHM6Ly9leGFtcGxlLnNoYXJlcG9pbnQuY29tL3NpdGVzL3Rlc3RzaXRlL19hcGkvV2ViL0xpc3RzKGd1aWQnZDNlYWNkYmMtOTc2Yy00NzA3LWE3YWEtNmVmZTdmZDliYzNjJykvSXRlbXMoMSkiLCJldGFnIjoiXCIyXCIiLCJ0eXBlIjoiU1AuRGF0YS5EYXRhbGlzdDJMaXN0SXRlbSJ9LCJUZXN0VmFsdWUiOjEwMDF9LHsiX19tZXRhZGF0YSI6eyJpZCI6IjAwNzY5MmFiLWQ4NDEtNDkwNS1iMDM2LWM5Yzk2MWZiNWU0MiIsInVyaSI6Imh0dHBzOi8vZXhhbXBsZS5zaGFyZXBvaW50LmNvbS9zaXRlcy90ZXN0c2l0ZS9fYXBpL1dlYi9MaXN0cyhndWlkJ2QzZWFjZGJjLTk3NmMtNDcwNy1hN2FhLTZlZmU3ZmQ5YmMzYycpL0l0ZW1zKDIpIiwiZXRhZyI6IlwiMlwiIiwidHlwZSI6IlNQLkRhdGEuRGF0YWxpc3QyTGlzdEl0ZW0ifSwiVGVzdFZhbHVlIjoxMDAyfV19fQ=",
        "$applicationHttp": {
          "headers": {},
          "body": {
            "d": {
              "results": [
                {
                  "__metadata": {
                    "id": "29091a22-8275-4bc5-a284-ee257782704c",
                    "uri": "https://example.sharepoint.com/sites/testsite/_api/Web/Lists(guid'd3eacdbc-976c-4707-a7aa-6efe7fd9bc3c')/Items(1)",
                    "etag": "\"2\"",
                    "type": "SP.Data.Datalist2ListItem"
                  },
                  "TestValue": 1001
                },
                {
                  "__metadata": {
                    "id": "007692ab-d841-4905-b036-c9c961fb5e42",
                    "uri": "https://example.sharepoint.com/sites/testsite/_api/Web/Lists(guid'd3eacdbc-976c-4707-a7aa-6efe7fd9bc3c')/Items(2)",
                    "etag": "\"2\"",
                    "type": "SP.Data.Datalist2ListItem"
                  },
                  "TestValue": 1002
                }
              ]
            }
          },
          "statusCode": 200
        }
      }
    }
  ]
}

Accept: application/atom+xml または、Accept: 指定なしの場合、以下です。

出力
{
  "$content-type": "multipart/mixed; boundary=batchresponse_9f3d3530-6fde-4fe8-9250-1d54372cceed",
  "$content": "LS1iYXRjaHJlc3BvbnNlXzlmM2QzNTMwLTZmZGUtNGZlOC05MjUwLTFkNTQzNzJjY2VlZA0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9odHRwDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCg0KSFRUUC8xLjEgMjAwIE9LDQpDT05URU5ULVRZUEU6IGFwcGxpY2F0aW9uL2F0b20reG1sO3R5cGU9ZmVlZDtjaGFyc2V0PXV0Zi04DQoNCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PGZlZWQgeG1sOmJhc2U9Imh0dHBzOi8vZXhhbXBsZS5zaGFyZXBvaW50LmNvbS9zaXRlcy90ZXN0c2l0ZS9fYXBpLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIgeG1sbnM6ZD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMiIHhtbG5zOm09Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYWRvLzIwMDcvMDgvZGF0YXNlcnZpY2VzL21ldGFkYXRhIiB4bWxuczpnZW9yc3M9Imh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MiIHhtbG5zOmdtbD0iaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiPjxpZD44ZTRjMWFkNi05MGQ3LTRjMDItOTgwYS1lOTRmMTAzOWYxMzg8L2lkPjx0aXRsZSAvPjx1cGRhdGVkPjIwMjMtMDktMTVUMTA6NTE6MDJaPC91cGRhdGVkPjxlbnRyeSBtOmV0YWc9IiZxdW90OzImcXVvdDsiPjxpZD5mM2ZiNWNiYS0yYTFiLTQ3MzktOGRkZC04YTgzODRmZGQ2ZDg8L2lkPjxjYXRlZ29yeSB0ZXJtPSJTUC5EYXRhLkRhdGFsaXN0TGlzdEl0ZW0iIHNjaGVtZT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMvc2NoZW1lIiAvPjxsaW5rIHJlbD0iZWRpdCIgaHJlZj0iV2ViL0xpc3RzKGd1aWQnNjUxYWEyNmYtNTMzMi00NjYwLTk3ZGUtYzNmMzIxYmNmOGZjJykvSXRlbXMoNikiIC8+PHRpdGxlIC8+PHVwZGF0ZWQ+MjAyMy0wOS0xNVQxMDo1MTowMlo8L3VwZGF0ZWQ+PGF1dGhvcj48bmFtZSAvPjwvYXV0aG9yPjxjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+PG06cHJvcGVydGllcz48ZDpUZXN0VmFsdWUgbTp0eXBlPSJFZG0uRG91YmxlIj4xPC9kOlRlc3RWYWx1ZT48L206cHJvcGVydGllcz48L2NvbnRlbnQ+PC9lbnRyeT48ZW50cnkgbTpldGFnPSImcXVvdDsyJnF1b3Q7Ij48aWQ+MzZlZjdiYTMtZWM2Mi00MDY1LWJkODgtN2NmYzVmOGExZTlmPC9pZD48Y2F0ZWdvcnkgdGVybT0iU1AuRGF0YS5EYXRhbGlzdExpc3RJdGVtIiBzY2hlbWU9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYWRvLzIwMDcvMDgvZGF0YXNlcnZpY2VzL3NjaGVtZSIgLz48bGluayByZWw9ImVkaXQiIGhyZWY9IldlYi9MaXN0cyhndWlkJzY1MWFhMjZmLTUzMzItNDY2MC05N2RlLWMzZjMyMWJjZjhmYycpL0l0ZW1zKDcpIiAvPjx0aXRsZSAvPjx1cGRhdGVkPjIwMjMtMDktMTVUMTA6NTE6MDJaPC91cGRhdGVkPjxhdXRob3I+PG5hbWUgLz48L2F1dGhvcj48Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94bWwiPjxtOnByb3BlcnRpZXM+PGQ6VGVzdFZhbHVlIG06dHlwZT0iRWRtLkRvdWJsZSI+MjwvZDpUZXN0VmFsdWU+PC9tOnByb3BlcnRpZXM+PC9jb250ZW50PjwvZW50cnk+PC9mZWVkPg0KLS1iYXRjaHJlc3BvbnNlXzlmM2QzNTMwLTZmZGUtNGZlOC05MjUwLTFkNTQzNzJjY2VlZA0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9odHRwDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCg0KSFRUUC8xLjEgMjAwIE9LDQpDT05URU5ULVRZUEU6IGFwcGxpY2F0aW9uL2F0b20reG1sO3R5cGU9ZmVlZDtjaGFyc2V0PXV0Zi04DQoNCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PGZlZWQgeG1sOmJhc2U9Imh0dHBzOi8vZXhhbXBsZS5zaGFyZXBvaW50LmNvbS9zaXRlcy90ZXN0c2l0ZS9fYXBpLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIgeG1sbnM6ZD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMiIHhtbG5zOm09Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYWRvLzIwMDcvMDgvZGF0YXNlcnZpY2VzL21ldGFkYXRhIiB4bWxuczpnZW9yc3M9Imh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MiIHhtbG5zOmdtbD0iaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiPjxpZD5jYTQ1YTlmZS0xYTAxLTQ0YTUtYTRhOS00YmVjZjFiNDA2YTU8L2lkPjx0aXRsZSAvPjx1cGRhdGVkPjIwMjMtMDktMTVUMTA6NTE6MDJaPC91cGRhdGVkPjxlbnRyeSBtOmV0YWc9IiZxdW90OzImcXVvdDsiPjxpZD5kZmNiMmI1YS1hYTM3LTQyMWUtODNmMC01Njk5OTk0MDIzNzE8L2lkPjxjYXRlZ29yeSB0ZXJtPSJTUC5EYXRhLkRhdGFsaXN0Mkxpc3RJdGVtIiBzY2hlbWU9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYWRvLzIwMDcvMDgvZGF0YXNlcnZpY2VzL3NjaGVtZSIgLz48bGluayByZWw9ImVkaXQiIGhyZWY9IldlYi9MaXN0cyhndWlkJ2QzZWFjZGJjLTk3NmMtNDcwNy1hN2FhLTZlZmU3ZmQ5YmMzYycpL0l0ZW1zKDEpIiAvPjx0aXRsZSAvPjx1cGRhdGVkPjIwMjMtMDktMTVUMTA6NTE6MDJaPC91cGRhdGVkPjxhdXRob3I+PG5hbWUgLz48L2F1dGhvcj48Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94bWwiPjxtOnByb3BlcnRpZXM+PGQ6VGVzdFZhbHVlIG06dHlwZT0iRWRtLkRvdWJsZSI+MTAwMTwvZDpUZXN0VmFsdWU+PC9tOnByb3BlcnRpZXM+PC9jb250ZW50PjwvZW50cnk+PGVudHJ5IG06ZXRhZz0iJnF1b3Q7MiZxdW90OyI+PGlkPmZhZDhjZTJlLWNlNDUtNGJkOS1hZDIzLThmNDI2MjYwZDY3NDwvaWQ+PGNhdGVnb3J5IHRlcm09IlNQLkRhdGEuRGF0YWxpc3QyTGlzdEl0ZW0iIHNjaGVtZT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMvc2NoZW1lIiAvPjxsaW5rIHJlbD0iZWRpdCIgaHJlZj0iV2ViL0xpc3RzKGd1aWQnZDNlYWNkYmMtOTc2Yy00NzA3LWE3YWEtNmVmZTdmZDliYzNjJykvSXRlbXMoMikiIC8+PHRpdGxlIC8+PHVwZGF0ZWQ+MjAyMy0wOS0xNVQxMDo1MTowMlo8L3VwZGF0ZWQ+PGF1dGhvcj48bmFtZSAvPjwvYXV0aG9yPjxjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+PG06cHJvcGVydGllcz48ZDpUZXN0VmFsdWUgbTp0eXBlPSJFZG0uRG91YmxlIj4xMDAyPC9kOlRlc3RWYWx1ZT48L206cHJvcGVydGllcz48L2NvbnRlbnQ+PC9lbnRyeT48L2ZlZWQ+DQotLWJhdGNocmVzcG9uc2VfOWYzZDM1MzAtNmZkZS00ZmU4LTkyNTAtMWQ1NDM3MmNjZWVkLS0=",
  "$multipart": [
    {
      "headers": {
        "Content-Type": "application/http",
        "Content-Transfer-Encoding": "binary"
      },
      "body": {
        "$content-type": "application/http; msgtype=response",
        "$content": "SFRUUC8xLjEgMjAwIE9LDQpDT05URU5ULVRZUEU6IGFwcGxpY2F0aW9uL2F0b20reG1sO3R5cGU9ZmVlZDtjaGFyc2V0PXV0Zi04DQoNCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PGZlZWQgeG1sOmJhc2U9Imh0dHBzOi8vZXhhbXBsZS5zaGFyZXBvaW50LmNvbS9zaXRlcy90ZXN0c2l0ZS9fYXBpLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIgeG1sbnM6ZD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMiIHhtbG5zOm09Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYWRvLzIwMDcvMDgvZGF0YXNlcnZpY2VzL21ldGFkYXRhIiB4bWxuczpnZW9yc3M9Imh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MiIHhtbG5zOmdtbD0iaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiPjxpZD44ZTRjMWFkNi05MGQ3LTRjMDItOTgwYS1lOTRmMTAzOWYxMzg8L2lkPjx0aXRsZSAvPjx1cGRhdGVkPjIwMjMtMDktMTVUMTA6NTE6MDJaPC91cGRhdGVkPjxlbnRyeSBtOmV0YWc9IiZxdW90OzImcXVvdDsiPjxpZD5mM2ZiNWNiYS0yYTFiLTQ3MzktOGRkZC04YTgzODRmZGQ2ZDg8L2lkPjxjYXRlZ29yeSB0ZXJtPSJTUC5EYXRhLkRhdGFsaXN0TGlzdEl0ZW0iIHNjaGVtZT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMvc2NoZW1lIiAvPjxsaW5rIHJlbD0iZWRpdCIgaHJlZj0iV2ViL0xpc3RzKGd1aWQnNjUxYWEyNmYtNTMzMi00NjYwLTk3ZGUtYzNmMzIxYmNmOGZjJykvSXRlbXMoNikiIC8+PHRpdGxlIC8+PHVwZGF0ZWQ+MjAyMy0wOS0xNVQxMDo1MTowMlo8L3VwZGF0ZWQ+PGF1dGhvcj48bmFtZSAvPjwvYXV0aG9yPjxjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+PG06cHJvcGVydGllcz48ZDpUZXN0VmFsdWUgbTp0eXBlPSJFZG0uRG91YmxlIj4xPC9kOlRlc3RWYWx1ZT48L206cHJvcGVydGllcz48L2NvbnRlbnQ+PC9lbnRyeT48ZW50cnkgbTpldGFnPSImcXVvdDsyJnF1b3Q7Ij48aWQ+MzZlZjdiYTMtZWM2Mi00MDY1LWJkODgtN2NmYzVmOGExZTlmPC9pZD48Y2F0ZWdvcnkgdGVybT0iU1AuRGF0YS5EYXRhbGlzdExpc3RJdGVtIiBzY2hlbWU9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYWRvLzIwMDcvMDgvZGF0YXNlcnZpY2VzL3NjaGVtZSIgLz48bGluayByZWw9ImVkaXQiIGhyZWY9IldlYi9MaXN0cyhndWlkJzY1MWFhMjZmLTUzMzItNDY2MC05N2RlLWMzZjMyMWJjZjhmYycpL0l0ZW1zKDcpIiAvPjx0aXRsZSAvPjx1cGRhdGVkPjIwMjMtMDktMTVUMTA6NTE6MDJaPC91cGRhdGVkPjxhdXRob3I+PG5hbWUgLz48L2F1dGhvcj48Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94bWwiPjxtOnByb3BlcnRpZXM+PGQ6VGVzdFZhbHVlIG06dHlwZT0iRWRtLkRvdWJsZSI+MjwvZDpUZXN0VmFsdWU+PC9tOnByb3BlcnRpZXM+PC9jb250ZW50PjwvZW50cnk+PC9mZWVkPg0K",
        "$applicationHttp": {
          "headers": {},
          "body": {
            "$content-type": "application/atom+xml; type=feed; charset=utf-8",
            "$content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48ZmVlZCB4bWw6YmFzZT0iaHR0cHM6Ly9leGFtcGxlLnNoYXJlcG9pbnQuY29tL3NpdGVzL3Rlc3RzaXRlL19hcGkvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiB4bWxuczpkPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2Fkby8yMDA3LzA4L2RhdGFzZXJ2aWNlcyIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMvbWV0YWRhdGEiIHhtbG5zOmdlb3Jzcz0iaHR0cDovL3d3dy5nZW9yc3Mub3JnL2dlb3JzcyIgeG1sbnM6Z21sPSJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI+PGlkPjhlNGMxYWQ2LTkwZDctNGMwMi05ODBhLWU5NGYxMDM5ZjEzODwvaWQ+PHRpdGxlIC8+PHVwZGF0ZWQ+MjAyMy0wOS0xNVQxMDo1MTowMlo8L3VwZGF0ZWQ+PGVudHJ5IG06ZXRhZz0iJnF1b3Q7MiZxdW90OyI+PGlkPmYzZmI1Y2JhLTJhMWItNDczOS04ZGRkLThhODM4NGZkZDZkODwvaWQ+PGNhdGVnb3J5IHRlcm09IlNQLkRhdGEuRGF0YWxpc3RMaXN0SXRlbSIgc2NoZW1lPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2Fkby8yMDA3LzA4L2RhdGFzZXJ2aWNlcy9zY2hlbWUiIC8+PGxpbmsgcmVsPSJlZGl0IiBocmVmPSJXZWIvTGlzdHMoZ3VpZCc2NTFhYTI2Zi01MzMyLTQ2NjAtOTdkZS1jM2YzMjFiY2Y4ZmMnKS9JdGVtcyg2KSIgLz48dGl0bGUgLz48dXBkYXRlZD4yMDIzLTA5LTE1VDEwOjUxOjAyWjwvdXBkYXRlZD48YXV0aG9yPjxuYW1lIC8+PC9hdXRob3I+PGNvbnRlbnQgdHlwZT0iYXBwbGljYXRpb24veG1sIj48bTpwcm9wZXJ0aWVzPjxkOlRlc3RWYWx1ZSBtOnR5cGU9IkVkbS5Eb3VibGUiPjE8L2Q6VGVzdFZhbHVlPjwvbTpwcm9wZXJ0aWVzPjwvY29udGVudD48L2VudHJ5PjxlbnRyeSBtOmV0YWc9IiZxdW90OzImcXVvdDsiPjxpZD4zNmVmN2JhMy1lYzYyLTQwNjUtYmQ4OC03Y2ZjNWY4YTFlOWY8L2lkPjxjYXRlZ29yeSB0ZXJtPSJTUC5EYXRhLkRhdGFsaXN0TGlzdEl0ZW0iIHNjaGVtZT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMvc2NoZW1lIiAvPjxsaW5rIHJlbD0iZWRpdCIgaHJlZj0iV2ViL0xpc3RzKGd1aWQnNjUxYWEyNmYtNTMzMi00NjYwLTk3ZGUtYzNmMzIxYmNmOGZjJykvSXRlbXMoNykiIC8+PHRpdGxlIC8+PHVwZGF0ZWQ+MjAyMy0wOS0xNVQxMDo1MTowMlo8L3VwZGF0ZWQ+PGF1dGhvcj48bmFtZSAvPjwvYXV0aG9yPjxjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+PG06cHJvcGVydGllcz48ZDpUZXN0VmFsdWUgbTp0eXBlPSJFZG0uRG91YmxlIj4yPC9kOlRlc3RWYWx1ZT48L206cHJvcGVydGllcz48L2NvbnRlbnQ+PC9lbnRyeT48L2ZlZWQ+DQo="
          },
          "statusCode": 200
        }
      }
    },
    {
      "headers": {
        "Content-Type": "application/http",
        "Content-Transfer-Encoding": "binary"
      },
      "body": {
        "$content-type": "application/http; msgtype=response",
        "$content": "SFRUUC8xLjEgMjAwIE9LDQpDT05URU5ULVRZUEU6IGFwcGxpY2F0aW9uL2F0b20reG1sO3R5cGU9ZmVlZDtjaGFyc2V0PXV0Zi04DQoNCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PGZlZWQgeG1sOmJhc2U9Imh0dHBzOi8vZXhhbXBsZS5zaGFyZXBvaW50LmNvbS9zaXRlcy90ZXN0c2l0ZS9fYXBpLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIgeG1sbnM6ZD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMiIHhtbG5zOm09Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYWRvLzIwMDcvMDgvZGF0YXNlcnZpY2VzL21ldGFkYXRhIiB4bWxuczpnZW9yc3M9Imh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MiIHhtbG5zOmdtbD0iaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiPjxpZD5jYTQ1YTlmZS0xYTAxLTQ0YTUtYTRhOS00YmVjZjFiNDA2YTU8L2lkPjx0aXRsZSAvPjx1cGRhdGVkPjIwMjMtMDktMTVUMTA6NTE6MDJaPC91cGRhdGVkPjxlbnRyeSBtOmV0YWc9IiZxdW90OzImcXVvdDsiPjxpZD5kZmNiMmI1YS1hYTM3LTQyMWUtODNmMC01Njk5OTk0MDIzNzE8L2lkPjxjYXRlZ29yeSB0ZXJtPSJTUC5EYXRhLkRhdGFsaXN0Mkxpc3RJdGVtIiBzY2hlbWU9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYWRvLzIwMDcvMDgvZGF0YXNlcnZpY2VzL3NjaGVtZSIgLz48bGluayByZWw9ImVkaXQiIGhyZWY9IldlYi9MaXN0cyhndWlkJ2QzZWFjZGJjLTk3NmMtNDcwNy1hN2FhLTZlZmU3ZmQ5YmMzYycpL0l0ZW1zKDEpIiAvPjx0aXRsZSAvPjx1cGRhdGVkPjIwMjMtMDktMTVUMTA6NTE6MDJaPC91cGRhdGVkPjxhdXRob3I+PG5hbWUgLz48L2F1dGhvcj48Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94bWwiPjxtOnByb3BlcnRpZXM+PGQ6VGVzdFZhbHVlIG06dHlwZT0iRWRtLkRvdWJsZSI+MTAwMTwvZDpUZXN0VmFsdWU+PC9tOnByb3BlcnRpZXM+PC9jb250ZW50PjwvZW50cnk+PGVudHJ5IG06ZXRhZz0iJnF1b3Q7MiZxdW90OyI+PGlkPmZhZDhjZTJlLWNlNDUtNGJkOS1hZDIzLThmNDI2MjYwZDY3NDwvaWQ+PGNhdGVnb3J5IHRlcm09IlNQLkRhdGEuRGF0YWxpc3QyTGlzdEl0ZW0iIHNjaGVtZT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMvc2NoZW1lIiAvPjxsaW5rIHJlbD0iZWRpdCIgaHJlZj0iV2ViL0xpc3RzKGd1aWQnZDNlYWNkYmMtOTc2Yy00NzA3LWE3YWEtNmVmZTdmZDliYzNjJykvSXRlbXMoMikiIC8+PHRpdGxlIC8+PHVwZGF0ZWQ+MjAyMy0wOS0xNVQxMDo1MTowMlo8L3VwZGF0ZWQ+PGF1dGhvcj48bmFtZSAvPjwvYXV0aG9yPjxjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+PG06cHJvcGVydGllcz48ZDpUZXN0VmFsdWUgbTp0eXBlPSJFZG0uRG91YmxlIj4xMDAyPC9kOlRlc3RWYWx1ZT48L206cHJvcGVydGllcz48L2NvbnRlbnQ+PC9lbnRyeT48L2ZlZWQ+DQo=",
        "$applicationHttp": {
          "headers": {},
          "body": {
            "$content-type": "application/atom+xml; type=feed; charset=utf-8",
            "$content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48ZmVlZCB4bWw6YmFzZT0iaHR0cHM6Ly9leGFtcGxlLnNoYXJlcG9pbnQuY29tL3NpdGVzL3Rlc3RzaXRlL19hcGkvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiB4bWxuczpkPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2Fkby8yMDA3LzA4L2RhdGFzZXJ2aWNlcyIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMvbWV0YWRhdGEiIHhtbG5zOmdlb3Jzcz0iaHR0cDovL3d3dy5nZW9yc3Mub3JnL2dlb3JzcyIgeG1sbnM6Z21sPSJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI+PGlkPmNhNDVhOWZlLTFhMDEtNDRhNS1hNGE5LTRiZWNmMWI0MDZhNTwvaWQ+PHRpdGxlIC8+PHVwZGF0ZWQ+MjAyMy0wOS0xNVQxMDo1MTowMlo8L3VwZGF0ZWQ+PGVudHJ5IG06ZXRhZz0iJnF1b3Q7MiZxdW90OyI+PGlkPmRmY2IyYjVhLWFhMzctNDIxZS04M2YwLTU2OTk5OTQwMjM3MTwvaWQ+PGNhdGVnb3J5IHRlcm09IlNQLkRhdGEuRGF0YWxpc3QyTGlzdEl0ZW0iIHNjaGVtZT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9hZG8vMjAwNy8wOC9kYXRhc2VydmljZXMvc2NoZW1lIiAvPjxsaW5rIHJlbD0iZWRpdCIgaHJlZj0iV2ViL0xpc3RzKGd1aWQnZDNlYWNkYmMtOTc2Yy00NzA3LWE3YWEtNmVmZTdmZDliYzNjJykvSXRlbXMoMSkiIC8+PHRpdGxlIC8+PHVwZGF0ZWQ+MjAyMy0wOS0xNVQxMDo1MTowMlo8L3VwZGF0ZWQ+PGF1dGhvcj48bmFtZSAvPjwvYXV0aG9yPjxjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+PG06cHJvcGVydGllcz48ZDpUZXN0VmFsdWUgbTp0eXBlPSJFZG0uRG91YmxlIj4xMDAxPC9kOlRlc3RWYWx1ZT48L206cHJvcGVydGllcz48L2NvbnRlbnQ+PC9lbnRyeT48ZW50cnkgbTpldGFnPSImcXVvdDsyJnF1b3Q7Ij48aWQ+ZmFkOGNlMmUtY2U0NS00YmQ5LWFkMjMtOGY0MjYyNjBkNjc0PC9pZD48Y2F0ZWdvcnkgdGVybT0iU1AuRGF0YS5EYXRhbGlzdDJMaXN0SXRlbSIgc2NoZW1lPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2Fkby8yMDA3LzA4L2RhdGFzZXJ2aWNlcy9zY2hlbWUiIC8+PGxpbmsgcmVsPSJlZGl0IiBocmVmPSJXZWIvTGlzdHMoZ3VpZCdkM2VhY2RiYy05NzZjLTQ3MDctYTdhYS02ZWZlN2ZkOWJjM2MnKS9JdGVtcygyKSIgLz48dGl0bGUgLz48dXBkYXRlZD4yMDIzLTA5LTE1VDEwOjUxOjAyWjwvdXBkYXRlZD48YXV0aG9yPjxuYW1lIC8+PC9hdXRob3I+PGNvbnRlbnQgdHlwZT0iYXBwbGljYXRpb24veG1sIj48bTpwcm9wZXJ0aWVzPjxkOlRlc3RWYWx1ZSBtOnR5cGU9IkVkbS5Eb3VibGUiPjEwMDI8L2Q6VGVzdFZhbHVlPjwvbTpwcm9wZXJ0aWVzPjwvY29udGVudD48L2VudHJ5PjwvZmVlZD4NCg=="
          },
          "statusCode": 200
        }
      }
    }
  ]
}

base64 エンコードされているところをデコードすると、以下のような内容です。

$content
--batchresponse_9f3d3530-6fde-4fe8-9250-1d54372cceed
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 200 OK
CONTENT-TYPE: application/atom+xml;type=feed;charset=utf-8

<?xml version="1.0" encoding="utf-8"?><feed xml:base="https://example.sharepoint.com/sites/testsite/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml"><id>8e4c1ad6-90d7-4c02-980a-e94f1039f138</id><title /><updated>2023-09-15T10:51:02Z</updated><entry m:etag="&quot;2&quot;"><id>f3fb5cba-2a1b-4739-8ddd-8a8384fdd6d8</id><category term="SP.Data.DatalistListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'651aa26f-5332-4660-97de-c3f321bcf8fc')/Items(6)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">1</d:TestValue></m:properties></content></entry><entry m:etag="&quot;2&quot;"><id>36ef7ba3-ec62-4065-bd88-7cfc5f8a1e9f</id><category term="SP.Data.DatalistListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'651aa26f-5332-4660-97de-c3f321bcf8fc')/Items(7)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">2</d:TestValue></m:properties></content></entry></feed>
--batchresponse_9f3d3530-6fde-4fe8-9250-1d54372cceed
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 200 OK
CONTENT-TYPE: application/atom+xml;type=feed;charset=utf-8

<?xml version="1.0" encoding="utf-8"?><feed xml:base="https://example.sharepoint.com/sites/testsite/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml"><id>ca45a9fe-1a01-44a5-a4a9-4becf1b406a5</id><title /><updated>2023-09-15T10:51:02Z</updated><entry m:etag="&quot;2&quot;"><id>dfcb2b5a-aa37-421e-83f0-569999402371</id><category term="SP.Data.Datalist2ListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'd3eacdbc-976c-4707-a7aa-6efe7fd9bc3c')/Items(1)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">1001</d:TestValue></m:properties></content></entry><entry m:etag="&quot;2&quot;"><id>fad8ce2e-ce45-4bd9-ad23-8f426260d674</id><category term="SP.Data.Datalist2ListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'd3eacdbc-976c-4707-a7aa-6efe7fd9bc3c')/Items(2)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">1002</d:TestValue></m:properties></content></entry></feed>
--batchresponse_9f3d3530-6fde-4fe8-9250-1d54372cceed--
$multipart[0].body.$content
HTTP/1.1 200 OK
CONTENT-TYPE: application/atom+xml;type=feed;charset=utf-8

<?xml version="1.0" encoding="utf-8"?><feed xml:base="https://example.sharepoint.com/sites/testsite/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml"><id>8e4c1ad6-90d7-4c02-980a-e94f1039f138</id><title /><updated>2023-09-15T10:51:02Z</updated><entry m:etag="&quot;2&quot;"><id>f3fb5cba-2a1b-4739-8ddd-8a8384fdd6d8</id><category term="SP.Data.DatalistListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'651aa26f-5332-4660-97de-c3f321bcf8fc')/Items(6)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">1</d:TestValue></m:properties></content></entry><entry m:etag="&quot;2&quot;"><id>36ef7ba3-ec62-4065-bd88-7cfc5f8a1e9f</id><category term="SP.Data.DatalistListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'651aa26f-5332-4660-97de-c3f321bcf8fc')/Items(7)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">2</d:TestValue></m:properties></content></entry></feed>
$multipart[0].body.$content.$applicationHttp.body.$content
<?xml version="1.0" encoding="utf-8"?><feed xml:base="https://example.sharepoint.com/sites/testsite/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml"><id>8e4c1ad6-90d7-4c02-980a-e94f1039f138</id><title /><updated>2023-09-15T10:51:02Z</updated><entry m:etag="&quot;2&quot;"><id>f3fb5cba-2a1b-4739-8ddd-8a8384fdd6d8</id><category term="SP.Data.DatalistListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'651aa26f-5332-4660-97de-c3f321bcf8fc')/Items(6)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">1</d:TestValue></m:properties></content></entry><entry m:etag="&quot;2&quot;"><id>36ef7ba3-ec62-4065-bd88-7cfc5f8a1e9f</id><category term="SP.Data.DatalistListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'651aa26f-5332-4660-97de-c3f321bcf8fc')/Items(7)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">2</d:TestValue></m:properties></content></entry></feed>
$multipart[1].body.$content
HTTP/1.1 200 OK
CONTENT-TYPE: application/atom+xml;type=feed;charset=utf-8

<?xml version="1.0" encoding="utf-8"?><feed xml:base="https://example.sharepoint.com/sites/testsite/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml"><id>ca45a9fe-1a01-44a5-a4a9-4becf1b406a5</id><title /><updated>2023-09-15T10:51:02Z</updated><entry m:etag="&quot;2&quot;"><id>dfcb2b5a-aa37-421e-83f0-569999402371</id><category term="SP.Data.Datalist2ListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'd3eacdbc-976c-4707-a7aa-6efe7fd9bc3c')/Items(1)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">1001</d:TestValue></m:properties></content></entry><entry m:etag="&quot;2&quot;"><id>fad8ce2e-ce45-4bd9-ad23-8f426260d674</id><category term="SP.Data.Datalist2ListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'd3eacdbc-976c-4707-a7aa-6efe7fd9bc3c')/Items(2)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">1002</d:TestValue></m:properties></content></entry></feed>
$multipart[1].body.$content.$applicationHttp.body.$content
<?xml version="1.0" encoding="utf-8"?><feed xml:base="https://example.sharepoint.com/sites/testsite/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml"><id>ca45a9fe-1a01-44a5-a4a9-4becf1b406a5</id><title /><updated>2023-09-15T10:51:02Z</updated><entry m:etag="&quot;2&quot;"><id>dfcb2b5a-aa37-421e-83f0-569999402371</id><category term="SP.Data.Datalist2ListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'd3eacdbc-976c-4707-a7aa-6efe7fd9bc3c')/Items(1)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">1001</d:TestValue></m:properties></content></entry><entry m:etag="&quot;2&quot;"><id>fad8ce2e-ce45-4bd9-ad23-8f426260d674</id><category term="SP.Data.Datalist2ListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" href="Web/Lists(guid'd3eacdbc-976c-4707-a7aa-6efe7fd9bc3c')/Items(2)" /><title /><updated>2023-09-15T10:51:02Z</updated><author><name /></author><content type="application/xml"><m:properties><d:TestValue m:type="Edm.Double">1002</d:TestValue></m:properties></content></entry></feed>

1 アクションで 2 行追加

Power Automate SharePoint に HTTP 要求を送信します アクション を使って、SharePoint のリストに対して、1 アクションで 2 行追加を行います。


前のセクションの「1 アクションで 2 リストデータ取得」は実施済みとして、
SharePoint に HTTP 要求を送信します アクション
ボディ だけ変えます。

作成していない場合は、「1 アクションで 2 リストデータ取得」まで戻って、SharePoint に HTTP 要求を送信します アクション追加まで実施してください。


以下の内容を設定します。
意味は、
SharePoint サイト:https://example.sharepoint.com/sites/testsite/

datalist リストに
タイトル=A、テスト値=3
タイトル=A、テスト値=4
と2行追加して、結果、以下のようにするという意味です。

タイトルテスト値
A1
A2
A3
A4

ボディ(テンプレート)
--batch_<BatchID>
Content-Type: multipart/mixed; boundary="changeset_<ChangesetID>"

--changeset_<ChangesetID>
Content-Type: application/http
Content-Transfer-Encoding: binary

POST https://<SharePointサイト>/_api/web/lists/getbytitle('<リスト名>')/items HTTP/1.1
Content-Type: application/json;odata=nometadata

{
  "<追加対象列名1>":"<追加する値1>",
  "<追加対象列名2>":"<追加する値2>",
...
}

以降、
--changeset_<ChangesetID>
から繰り返し
今回指定するボディ
--batch_@{outputs('BatchID')}
Content-Type: multipart/mixed; boundary="changeset_@{outputs('ChangesetID')}"

--changeset_@{outputs('ChangesetID')}
Content-Type: application/http
Content-Transfer-Encoding: binary

POST https://example.sharepoint.com/sites/testsite/_api/web/lists/getbytitle('datalist')/items HTTP/1.1
Content-Type: application/json;odata=nometadata

{"Title":"A","TestValue":"3"}

--changeset_@{outputs('ChangesetID')}
Content-Type: application/http
Content-Transfer-Encoding: binary

POST https://example.sharepoint.com/sites/testsite/_api/web/lists/getbytitle('datalist')/items HTTP/1.1
Content-Type: application/json;odata=nometadata

{"Title":"A","TestValue":"4"}

--changeset_@{outputs('ChangesetID')}--
--batch_@{outputs('BatchID')}--

POST SharePoint に HTTP 要求を送信します


POSTフロー実行結果


POSTフローSharePoint側

成功しました!


"statusCode": 201 の場合、追加成功です。


1 アクションで 2 行更新

Power Automate SharePoint に HTTP 要求を送信します アクション を使って、SharePoint のリストに対して、1 アクションで 2 行更新を行います。


1 アクションで 2 リストデータ取得」は実施済みとして、
SharePoint に HTTP 要求を送信します アクション
ボディ だけ変えます。

作成していない場合は、「1 アクションで 2 リストデータ取得」まで戻って、SharePoint に HTTP 要求を送信します アクション追加まで実施してください。


以下の内容を設定します。
意味は、
SharePoint サイト:https://example.sharepoint.com/sites/testsite/

datalist リスト
テスト値=2 とテスト値=3 の2レコードに関して、
タイトル=A_X
と更新して、結果、以下のようにするという意味です。

タイトルテスト値
A1
A_X2
A_X3
A4

なお、説明の簡略化のため、該当レコードの ID の値は、ID 列を表示して、把握済みとします。フローで把握する場合、複数の項目の取得などで把握することになると思います。
今回の場合、716 です。

該当レコードの ID の値


また、
"__metadata":{"type":"SP.Data.<リスト名>ListItem"},
<リスト名> の部分ですが、頭が大文字である必要があります。小文字の場合、動作しません。
例:リスト名が datalist → "__metadata":{"type":"SP.Data.DatalistListItem"},


ボディ(テンプレート)
--batch_<BatchID>
Content-Type: multipart/mixed; boundary="changeset_<ChangesetID>"

--changeset_<ChangesetID>
Content-Type: application/http
Content-Transfer-Encoding: binary

PATCH  https://<SharePointサイト>/_api/web/lists/getByTitle('<リスト名>')/items(<ID>) HTTP/1.1
Content-Type: application/json;odata=verbose
IF-MATCH: *

{
  "__metadata":{"type":"SP.Data.<頭大文字のリスト名>ListItem"},
  "<更新対象列名1>":"<更新後の値1>",
  "<更新対象列名2>":"<更新後の値2>",
...
}

以降、
--changeset_<ChangesetID>
から繰り返し

IF-MATCH: * は必須です。
更新対象の ETag の条件を指定するものですが、把握するのは大変なので、* です。
無い場合、
-1, Microsoft.SharePoint.Client.ClientServiceException
要求 ETag 値 '' がオブジェクトの ETag 値 '"ca053fd8-7c02-4b31-85e1-17c3144a8183,3"' と一致しません。
"statusCode": 412
とエラーになり、更新できません。

要求 ETag 値 エラー


また、
Content-Type: application/json;odata=varbose は必須です。
無い場合、
-1, Microsoft.SharePoint.Client.InvalidClientQueryException
プロパティ '__metadata' は型 'SP.Data.DatalistListItem' に存在しません。型で定義されているプロパティ名のみ使用してください。
"statusCode": 400
とエラーになり、更新できません。

プロパティ __metadata エラー

今回指定するボディ
--batch_@{outputs('BatchID')}
Content-Type: multipart/mixed; boundary="changeset_@{outputs('ChangesetID')}"

--changeset_@{outputs('ChangesetID')}
Content-Type: application/http
Content-Transfer-Encoding: binary

PATCH  https://example.sharepoint.com/sites/testsite/_api/web/lists/getByTitle('datalist')/items(7) HTTP/1.1
Content-Type: application/json;odata=varbose
IF-MATCH: *

{
  "__metadata":{"type":"SP.Data.DatalistListItem"},
  "Title":"A_X"
}

--changeset_@{outputs('ChangesetID')}
Content-Type: application/http
Content-Transfer-Encoding: binary

PATCH  https://example.sharepoint.com/sites/testsite/_api/web/lists/getByTitle('datalist')/items(16) HTTP/1.1
Content-Type: application/json;odata=varbose
IF-MATCH: *

{
  "__metadata":{"type":"SP.Data.DatalistListItem"},
  "Title":"A_X"
}

--changeset_@{outputs('ChangesetID')}--
--batch_@{outputs('BatchID')}--

PATCHフロー SharePoint に HTTP 要求を送信します


PATCHフロー実行結果


PATCHフローSharePoint側


成功しました!


"statusCode": 204 の場合、更新成功です。


1 アクションで 2 行削除

Power Automate SharePoint に HTTP 要求を送信します アクション を使って、SharePoint のリストに対して、1 アクションで 2 行削除を行います。


1 アクションで 2 リストデータ取得」は実施済みとして、
SharePoint に HTTP 要求を送信します アクション
ボディ だけ変えます。

作成していない場合は、「1 アクションで 2 リストデータ取得」まで戻って、SharePoint に HTTP 要求を送信します アクション追加まで実施してください。


以下の内容を設定します。
意味は、
SharePoint サイト:https://example.sharepoint.com/sites/testsite/

datalist リスト
テスト値=2 とテスト値=3 の2レコードを削除し、
結果、以下のようにするという意味です。

タイトルテスト値
A1
A4

なお、説明の簡略化のため、該当レコードの ID の値は、ID 列を表示して、把握済みとします。フローで把握する場合、複数の項目の取得などで把握することになると思います。
今回の場合、716 です。

該当レコードの ID の値


前セクション「1 アクションで 2 行更新」と共通の注意点の説明は、省略します。


ボディ(テンプレート)
--batch_<BatchID>
Content-Type: multipart/mixed; boundary="changeset_<ChangesetID>"

--changeset_<ChangesetID>
Content-Type: application/http
Content-Transfer-Encoding: binary

DELETE  https://<SharePointサイト>/_api/web/lists/getByTitle('<リスト名>')/items(<ID>) HTTP/1.1
Content-Type: application/json;odata=verbose
Accept: application/json;odata=nometadata
IF-MATCH: *

以降、
--changeset_<ChangesetID>
から繰り返し
今回指定するボディ
--batch_@{outputs('BatchID')}
Content-Type: multipart/mixed; boundary="changeset_@{outputs('ChangesetID')}"

--changeset_@{outputs('ChangesetID')}
Content-Type: application/http
Content-Transfer-Encoding: binary

DELETE  https://example.sharepoint.com/sites/testsite/_api/web/lists/getByTitle('datalist')/items(7) HTTP/1.1
Content-Type: application/json;odata=verbose
Accept: application/json;odata=nometadata
IF-MATCH: *

--changeset_@{outputs('ChangesetID')}
Content-Type: application/http
Content-Transfer-Encoding: binary

DELETE  https://example.sharepoint.com/sites/testsite/_api/web/lists/getByTitle('datalist')/items(16) HTTP/1.1
Content-Type: application/json;odata=verbose
Accept: application/json;odata=nometadata
IF-MATCH: *

--changeset_@{outputs('ChangesetID')}--
--batch_@{outputs('BatchID')}--

DELETEフロー SharePoint に HTTP 要求を送信します


DELETEフロー実行結果


DELETEフローSharePoint側


成功しました!


"statusCode": 200 の場合、削除成功です。


上限について

1回のリクエストでリクエストを何回分含めることができるか、上限を探ってみました。
1回のリクエストの「上限 100 説」は見つかったのですが、明確に 100 と言っている記事は見当たりませんでした。
結論から言いますと、GET(取得)は、99 件、それ以外の更新系の上限は、1000 件のようです。

今回の記事の場合です。時期やライセンス、リクエスト内容、データによって異なる可能性がありますので、あくまで参考情報として捉えて、事前に実際に確認してください。

ボディに何個リクエストを含められるかの話ではないですが、

GET https://example.sharepoint.com/sites/testsite/_api/web/lists/getbytitle('datalist')/items?$select=TestValue HTTP/1.1

の場合、100 件の結果まで得られました。

1度に大量のデータ取得の場合、複数の項目の取得 アクションを使用する場合、1アクション実行で 5000 件取得できます。工夫すれば、さらに多く取得できます。

(参考:「Power Automate & Share Point の 5000 件問題を攻略した」)


以下は、実際にやってみた結果です。


以下のようにシェルスクリプトで、指定の数量のリクエストが発行できるようにボディ部分を生成、コピペして、確認しました。
なお、GET(取得)は、ID でフィルタして、1 件ずつ取り出しています。

データ量が多くなると、コピペするだけで時間がかかりました。

取得ボディ作成
#!/bin/bash
start=$1
end=$2
echo "--batch_@{outputs('BatchID')}"
echo "Content-Type: multipart/mixed; boundary=\"changeset_@{outputs('ChangesetID')}\""
for i in $(seq $start $end)
do
  echo ""
  echo "--batch_@{outputs('BatchID')}"
  echo "Content-Type: application/http"
  echo "Content-Transfer-Encoding: binary"
  echo ""
  echo "GET https://example.sharepoint.com/sites/testsite/_api/web/lists/getbytitle('datalist')/items?\$filter=ID eq $i HTTP/1.1"
  echo "Accept: application/json;odata=nometadata"
done
echo ""
echo "--batch_@{outputs('BatchID')}--"
追加ボディ作成
#!/bin/bash
count=$1
echo "--batch_@{outputs('BatchID')}"
echo "Content-Type: multipart/mixed; boundary=\"changeset_@{outputs('ChangesetID')}\""
for i in $(seq 1 $count)
do
  echo ""
  echo "--changeset_@{outputs('ChangesetID')}"
  echo "Content-Type: application/http"
  echo "Content-Transfer-Encoding: binary"
  echo ""
  echo "POST https://example.sharepoint.com/sites/testsite/_api/web/lists/getbytitle('datalist')/items HTTP/1.1"
  echo "Content-Type: application/json;odata=nometadata"
  echo ""
  echo "{\"Title\":\"A\",\"TestValue\":\"$i\"}"
done
echo ""
echo "--changeset_@{outputs('ChangesetID')}--"
echo "--batch_@{outputs('BatchID')}--"
更新ボディ作成
#!/bin/bash
start=$1
end=$2
echo "--batch_@{outputs('BatchID')}"
echo "Content-Type: multipart/mixed; boundary=\"changeset_@{outputs('ChangesetID')}\""
for i in $(seq $start $end)
do
  echo ""
  echo "--changeset_@{outputs('ChangesetID')}"
  echo "Content-Type: application/http"
  echo "Content-Transfer-Encoding: binary"
  echo ""
  echo "PATCH https://example.sharepoint.com/sites/testsite/_api/web/lists/getByTitle('datalist')/items($i) HTTP/1.1"
  echo "Content-Type: application/json;odata=verbose"
  echo "IF-MATCH: *"
  echo ""
  echo "{\"__metadata\":{\"type\":\"SP.Data.DatalistListItem\"},\"Title\":\"A_X\"}"
done
echo ""
echo "--changeset_@{outputs('ChangesetID')}--"
echo "--batch_@{outputs('BatchID')}--"
削除ボディ作成
#!/bin/bash
start=$1
end=$2
echo "--batch_@{outputs('BatchID')}"
echo "Content-Type: multipart/mixed; boundary=\"changeset_@{outputs('ChangesetID')}\""
for i in $(seq $start $end)
do
  echo ""
  echo "--changeset_@{outputs('ChangesetID')}"
  echo "Content-Type: application/http"
  echo "Content-Transfer-Encoding: binary"
  echo ""
  echo "DELETE https://example.sharepoint.com/sites/testsite/_api/web/lists/getByTitle('datalist')/items($i) HTTP/1.1"
  echo "Content-Type: application/json;odata=verbose"
  echo "Accept: application/json;odata=nometadata"
  echo "IF-MATCH: *"
done
echo ""
echo "--changeset_@{outputs('ChangesetID')}--"
echo "--batch_@{outputs('BatchID')}--"

結果は、以下のようになりました。

実行内容実行時間結果
99 件取得1 秒OK
100 件取得1 秒エラー
101 件取得1 秒エラー
1000 件追加1 分 13 秒OK
1001 件追加46 秒エラー
(1000 件追加されていた。)
1000 件更新32 秒OK
1001 件更新31 秒エラー
(1000 件更新されていた。)
1000 件削除59 秒OK
1001 件削除45 秒エラー
(1000 件削除されていた。)

取得のエラーは、
現在のバッチ メッセージに含まれているパーツが多すぎます。バッチ メッセージで許可されるクエリ操作および変更セットは最大 '100' 件です。
というエラーです。
エラー内容から、100 が上限かと思います。(99 はセーフ。100 は、エラー。)


追加、更新、削除のエラーは、全て、
現在の変更セットに含まれている操作が多すぎます。変更セットで許可される操作は最大 '1000' 件です。
というエラーです。
エラー内容から、1000 が上限かと思います。(1000 はセーフ。1001 は、エラー。)

今回は、掲載を見送りましたが、それぞれに適用する(Apply to each)Do until アクションを使って、900 件ずつリクエストして、5000 件を超えて、追加、更新、削除ができました。OData $batch の場合、アクションの実行回数を減らせるとともに、実行時間が圧倒的に短く済みます。

loading...