SharePoint Online での Invoke-PnPQuery と ContextExecuteQuery
2022.09.27
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 を操作する時のお作法、と言われてしまうとミもフタもないのですが…。同じ問題に遭遇する方もいるかと思いますので、ここに投稿しておきます。