You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题原因

你的脚本存在两个核心问题:

  1. JSON格式无效:你提供的JSON是两个独立对象的拼接,没有用数组[]包裹,本身不符合JSON语法规范。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:13:17