からめもぶろぐ。

SharePoint が得意なフレンズなんだね!すごーい!

Microsoft Graph でも SharePoint リスト アイテムの複数の値を持つ列が更新できない

SharePoint REST API の時代からですが複数の値を持つ列 (MultiChoice、UserMulti、LookupMulti) を更新できないという問題がありました。英語フォーラムの情報を見てもできるという情報もあったりできないという情報があったりして錯綜しているのですが、少なくとも私が試した限りでは解決できていません。

具体的には以下のようなリクエストを投げると

POST https://example.sharepoint.com/_api/web/lists('<ListId>')/items(<ItemId>)
Authorization: Bearer <AccessToken>
Accept: application/json; odata=verbose
Content-Type: application/json; odata=verbose

{
    "__metadata": {
        "type": "SP.ListItem"
    },
    "ChoiceField": {
        "results": [
            "Test Value"
        ]
    }
}

400 エラーが返ってきます。*1

Microsoft.SharePoint.Client.InvalidClientQueryException: A value without a type name was found and no expected type is available. When the model is specified, each value in the payload must have a type which can be either specified in the payload, explicitly by the caller or implicitly inferred from the parent value. *2

これ Microsoft Graph で改善してるのかなと思ってふと試したところ全然治っていないみたいです。

{
    "error": {
        "code": "-1, Microsoft.SharePoint.Client.InvalidClientQueryException",
        "message": "A value without a type name was found and no expected type is available. When the model is specified, each value in the payload must have a type which can be either specified in the payload, explicitly by the caller or implicitly inferred from the parent value.",
    }
}

まあ Microsoft Graph は SharePoint REST API をラップしているだけなので当たり前といえば当たり前なのですが、悲しい気持ちになりましたというお話。

*1:ちなみに例外として null を入れると 200 が返ってきます。つらい。

*2:型名のない値が見つかりましたが、使用できる必要な型がありません。モデルが指定されている場合、ペイロード内の値ごとに、ペイロードで指定できる型が必要です。その型は、呼び出し元による明示的な型か、親値から暗黙的に推定される型にすることができます。