PowerShell调用Graph API批量添加Office 365组日历事件仅成功第一个的问题
问题:PowerShell脚本添加Office 365组日历事件仅第一个成功,第二个无反应无报错
我编写了如下PowerShell脚本,用于向Office 365组日历添加事件。运行该脚本后,仅第一个事件添加成功,第二个事件未添加且无报错信息。请问脚本存在什么问题?
$json = @" { "subject": "Event1", "start": { "timeZone": "UTC", "dateTime": "2023-06-10T08:00" }, "end": { "timeZone": "UTC", "dateTime": "2023-06-10T09:00" } }, { "subject": "Event2", "start": { "timeZone": "UTC", "dateTime": "2023-06-11T08:00" }, "end": { "timeZone": "UTC", "dateTime": "2023-06-11T09:00" } } "@ $apiUrl = "https://graph.microsoft.com/v1.0/groups/xxxx-xxxx-xxxx-xxx/events" Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri $apiUrl -Method Post -ContentType "application/json" -Body $json
问题原因
你的脚本存在两个核心问题:
- JSON格式无效:你提供的JSON是两个独立对象的拼接,没有用数组
[]包裹,本身不符合JSON语法规范。 - API接口不支持批量提交:
POST /groups/{id}/events接口只接受单个事件对象作为请求体,即使你把JSON改成数组格式,该接口也不会自动处理多个事件,只会解析第一个对象,忽略后续内容且不报错。
解决方案
方法一:循环逐个创建事件
将事件数据拆分为单个对象,循环调用API创建每个事件,这种方式简单直观,适合少量事件的场景:
# 定义事件数组 $events = @( @{ subject = "Event1" start = @{ timeZone = "UTC" dateTime = "2023-06-10T08:00" } end = @{ timeZone = "UTC" dateTime = "2023-06-10T09:00" } }, @{ subject = "Event2" start = @{ timeZone = "UTC" dateTime = "2023-06-11T08:00" } end = @{ timeZone = "UTC" dateTime = "2023-06-11T09:00" } } ) $apiUrl = "https://graph.microsoft.com/v1.0/groups/xxxx-xxxx-xxxx-xxx/events" $authHeaders = @{Authorization = "Bearer $($Tokenresponse.access_token)"} # 循环创建每个事件 foreach ($event in $events) { $jsonBody = $event | ConvertTo-Json -Depth 3 Invoke-RestMethod -Headers $authHeaders -Uri $apiUrl -Method Post -ContentType "application/json" -Body $jsonBody }
方法二:使用Microsoft Graph批量请求API
如果需要批量创建大量事件,可使用Graph的批量请求端点,将多个创建请求打包发送,减少API调用次数:
$batchRequest = @" { "requests": [ { "id": "1", "method": "POST", "url": "/groups/xxxx-xxxx-xxxx-xxx/events", "body": { "subject": "Event1", "start": { "timeZone": "UTC", "dateTime": "2023-06-10T08:00" }, "end": { "timeZone": "UTC", "dateTime": "2023-06-10T09:00" } }, "headers": { "Content-Type": "application/json" } }, { "id": "2", "method": "POST", "url": "/groups/xxxx-xxxx-xxxx-xxx/events", "body": { "subject": "Event2", "start": { "timeZone": "UTC", "dateTime": "2023-06-11T08:00" }, "end": { "timeZone": "UTC", "dateTime": "2023-06-11T09:00" } }, "headers": { "Content-Type": "application/json" } } ] } "@ $batchApiUrl = "https://graph.microsoft.com/v1.0/$batch" Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri $batchApiUrl -Method Post -ContentType "application/json" -Body $batchRequest
注意事项
- 方法一中
ConvertTo-Json需要指定-Depth 3,否则嵌套的start和end对象会被截断。 - 方法二中每个请求必须包含唯一的
id,批量请求返回结果会通过该ID对应每个请求的执行状态。
内容的提问来源于stack exchange,提问作者bickyz
相关产品推荐
相关产品推荐

