複数行更新ができないSPOリスト
かんたんに使えてPower AppsのDBとしても気軽に使えるSPOリストです。Power Automateのクラウドフローから扱うときに、複数の行をまとめて更新しようとおもうと、それに適したアクションが存在しないことに気が付きます。
たとえばSQLなら
イメージとして、一般的なデータベースはSQLで以下のような指定をすれば条件にあう行の指定した列の値をまとめて変更することができます。
たとえば、textA列の値が Hello である行の boolB列をTrueにするには、こんな感じの表現ができます。
UPDATE testList
SET "boolB" = TRUE
WHERE "textA" = 'Hello';
これがやりたくても、残念ながら既存のクラウドフローのアクションだと複数行をまとめて更新すること自体ができません。
SQLっぽいことを実現するには
そこで、処理を2つに分けます。
- textA列の値が「Hello」である一覧を取得します
- 取得した行のIDを拾って、対象の行の指定された列の値を更新します
さきほど複数の列をまとめて更新する既存のアクションが無いと言っていましたが、こういうのを実現するには「SharePointにHTTP要求を送信します」アクションを使います。

ではどんなHTTP要求を送信すればよいのか?
そこが問題でして。ネットの海を探し回りましたが、ズバリこれというものはなかなか見つからず。
ポイントはどのようなHTTP要求を送信すればよいかという点ですので、この記事では更新対象の行IDの配列を与えることで、一括で値を更新するとう点に絞ってご紹介します。
要求内容探しの試行錯誤は別途ブログに書いてみましたのでこちらをご覧ください。
更新対象を絞ってIDを配列化する
「複数の項目の取得」アクションでリストを指定し、フィルタークエリに以下のように指定します。textAは列名です。eqはイコールを表します。
textA eq 'Hello'
次に、取得した結果からID部分を配列化するために「選択」アクションを使います。
「開始」には前のアクションのvalueを配置します。
「マップ」には以下のように指定します。
item()?['ID']
テスト実行すると角括弧に囲まれた8番9番のIDが取得できていることがわかります。この記事の一番上にはりつけてあったSPOリストを見てもらうと、8番9番のtextA列の値が「Hello」になっていますね。

ID配列から指定列の値を書き換える
今回は8番と9番のID列にたいして、boolB列の値をFalseからTrueに変更してやります。
いろいろ伝えたいことは多いのですが、まずは以下のような状態で実行してみましょう。
SPOリストが存在するSharePointサイトを指定してください
POST
_api/web/GetList(@a1)/BulkValidateUpdateListItems()?@a1='/sites/testSite/Lists/testList'
URIの指定は注意が必要です。「testSite」はサイトの名前。「testList」は使っているリストの名前に変えてください。
{
"Accept": "application/json;odata=verbose",
"Content-Type": "application/json;odata=verbose"
}
ヘッダーは右側のボタンをクリックしてJSONモードにすると一度に貼り付けられて便利です。JSONを貼ったあとにもう一度ボタンを押すと以下のようになります。
{
"itemIds": [8, 9],
"formValues": [
{
"FieldName": "boolB",
"FieldValue": "1",
"HasException": false,
"ErrorMessage": null
}
],
"bNewDocumentUpdate": false,
"checkInComment": null
}
ボディーはiteIdsの部分が今回更新する対象のID配列です。
FieldValueの値は1がTrue、0がFalseを表します。
テスト実行してみると、itemIdsに指定した8番9番のboolB列にチェックマークが付きました。成功です!
ここまでできたら、「選択」アクションで作った配列をstring関数を使って文字列にしてitemIdsの値として配置します。
string(body('選択'))
さて、この方法は早いのか??
無事に動作したので、byeの項目を50行作って、一括更新を試してみることにします。
まず、Apply to eachを使った場合を計測してみると31秒かかりました。

HTTP要求方式で実行するには、「複数の項目の取得」でフィルタークエリに以下のように設定します。
textA eq 'Bye'
結果はなんと31秒→2秒に短縮が実現しました! 爆速でしょう?

この方法はAPIリファレンスに載ってない?
ないんです。
BulkValidateUpdateListItems というプロパティを使っているのですが、どうやらこれはCSOM由来の方法のようで、SharePoint REST APIのリファレンスに掲載されていない非公開のエンドポイントとして動作するようです。
この方法についてはこちらのサイトから情報を得ました。
非公式なのでいつ使えなくなるかもしれませんし、POSTを使う要求なので本番前にはかならず検証して使ってほしいのですが、めちゃめちゃ有用です。
こんな人が書いてます。
こちらの記事はランゲルハンス島のDDさんが紹介しました。ブログでクラウドフローのTIPSのようなものを書いたり、Qiita記事を書いたりしていますのでご贔屓に。
フォローやいいねいただけると嬉しいです。
関西のPowerPlatform系の勉強会にときどき出没しますので、気軽に声をかけていただけると喜びます!






