Microsoft 365

SharePoint Online での Invoke-PnPQuery と ContextExecuteQuery

SharePoint Online を PowerShell で操作していたところ、「Invoke-PnPQuery」「$Context.ExecuteQuery」で予想外な挙動に遭遇しました。

列を非表示にする

何をしていたのかと言われれば、「PowerShell コマンドで列を非表示にする」です。オンプレミス SharePoint に慣れた方ならお馴染みのアレです。

「SetShowInNewForm」
「SetShowInDisplayForm」
「SetShowInEditForm」

SharePoint Online では既定でカスタムスクリプトが無効化されていますが、有効化すれば引き続きこれらの設定を利用できます(ただし、モダンUIでは表示フォームと編集フォームが一体化してしまっているため、クラシックUIと挙動が異なります)。

不可思議な挙動

PowerShell スクリプト上でこれらのパラメーターをすべて $False に指定し、それをコミットしようとしました。

$field.SetShowInNewForm($False)
$field.SetShowInDisplayForm($False)
$field.SetShowInEditForm($False)
Invoke-PnPQuery

すると、謎のエラーが…。Invoke-PnPQuery を Context.ExecuteQuery に変えてみても同じエラーが発生しました。

The node to be inserted is from a different document context.

回避方法

しばらく悪戦苦闘しましたが、以下に書き換えたところ正常に動作しました。

$field.SetShowInNewForm($False)
Invoke-PnPQuery
$field.SetShowInDisplayForm($False)
Invoke-PnPQuery
$field.SetShowInEditForm($False)
Invoke-PnPQuery

命令単位でコミットする感じですね。これが PowerShell で SharePoint Online を操作する時のお作法、と言われてしまうとミもフタもないのですが…。同じ問題に遭遇する方もいるかと思いますので、ここに投稿しておきます。