💻

Graph API では SharePoint リストのハイパーリンク列が操作できない件

2023/07/16に公開

この記事について

この記事では、SharePoint Online リスト (Microsoft Lists) における ハイパーリンク列 について、Graph API 経由による操作がサポートされていないことの説明と、Graph API の代わりに Microsoft Lists のハイパーリンク列を操作する方法について記載しています。

きっかけ

諸事情により、下記画像のようなハイパーリンク列を含む Microsoft Lists を作成し、Graph API を使用してリストアイテムを Graph PowerShell を使用してリストアイテムを追加しようとしていました。

Graph Explorer を使用して、Graph API Reference を見て、リストアイテム作成のエンドポイント確認したり、POST の Body 部分の形式を確認したりしていたわけです。

https://developer.microsoft.com/en-us/graph/graph-explorer

https://learn.microsoft.com/en-us/graph/api/listitem-create?view=graph-rest-1.0&tabs=http

試しに Graph Explorer で GET したところ、

ちゃんとリストアイテム情報取れました。
ハイパーリンク列もこうやって埋めるのか、と理解したので、POST でリストアイテムを追加しようとしたわけですが

なぜか 400 で Bad Request が返ってきます。(application_url がハイパーリンク列の列名)
いろいろ試したところ、ハイパーリンク列が必須列になっているかどうかに関係なく、ハイパーリンク列がない fields で POST すると、処理は成功するようです。

ちなみに、どうも Graph API 経由のリストアイテム作成は、列が必須列だったとしてもバリデーションチェックは通らないようです。

Microsoft 社公式見解

流石に意味不明だったのと、Graph API Reference にもそんなこと書いてなさそうだったので、SR で Microsoft 社に確認しました。そうすると

いただいた情報をもとに、サンプルスクリプトで弊社テスト環境にて同様なエラーを再現することができました。
そして、データセンタ側の診断ログからGraph API処理中、データタイプを認識できず、InvalidRequestで返し、お問い合わせの現象が再現している状況を確認いたしました。

弊社開発部署とも連携調査しましたが、現段階 Graph APIで リストのハイパーリンク列に設定する操作がサポートされないという回答でした。

という回答が返ってきました。なんだよ、サポートしてないのかよ、って感じです。
どうも、類似事象が既に Graph API の GitHub リポジトリの issue にも登録されていて、ハイパーリンク列と画像列はサポートしないとかいう (クソ) 説明で issue もクローズされていました。
SharePoint API 含む各種 API を Graph API に移行しろとか言うなら、このくらいやってくれよ、って感じです。

Missing documentation on Creating or Updating Sharepoint Listitems that contain Hyperlink fields
https://github.com/microsoftgraph/microsoft-graph-docs/issues/1965

ColumnDefinition resource
https://github.com/microsoftgraph/microsoft-graph-docs/blob/master/api-reference/v1.0/resources/columndefinition.md

https://github.com/microsoftgraph/microsoft-graph-docs/issues/1965

https://github.com/microsoftgraph/microsoft-graph-docs/blob/master/api-reference/v1.0/resources/columndefinition.md

Graph API でできないならどうするか

結論、Microsoft 社公式なら SharePoint API や SharePoint Online PowerShell、Microsoft 社とは関係ないですがコミュニティで開発されている PnP PowerShell などを使うことになりそうです。
個人的には、PnP PowerShell が一番 PowerShell の中ではスクリプトが直感的というか、あれこれ考えずにサクッとできる感じだと思います。
後述の PnP PowerShell は Add-PnPListItem を使ってリストアイテムの新規作成をしています。もし追加済みのリストアイテムを操作する場合は Set-PnPListItem を使ってください。

$SiteURL = "https://{tenant}.sharepoint.com/sites/{siteName}"
$ListName = "{listDisplayName}"
$Value = @{
    "Title" = "AAA申請書";
    "apprication_id" = 6;
    "applicant" = "test01@example.com";
    "application_date" = "2023-07-14T15:00:00Z";
    "application_url" = "http://example.com/application/AAA/6, http://example.com/application/AAA/6"
}

# GUI 環境で自分の ID で実行する場合
Connect-PnPOnline -Url $SiteURL -Interactive
# CUI 環境の場合は DeviceLogin または サービスプリンシパルを利用
# Connect-PnPOnline -Url $SiteURL -DeviceLogin
# Connect-PnPOnline -Url $SiteURL -ClientId $ClientId -ClientSecret $Secret
Add-PnPListItem -List $ListName -Values $Value

Microsoft 社のサポートがないのは嫌だ、と言う人は SharePoint Online PowerShell とかを使っておけばいいと思います。
以下のサイトなどを参考に、頑張ってスクリプト書いてください。

https://www.sharepointdiary.com/2017/08/sharepoint-online-update-hyperlink-field-using-powershell.html

参考情報

GitHub

PnP

その他

Discussion