Google Calendar API无法创建重复事件问题排查求助
问题:Google Calendar API创建重复事件仅生成单次事件
我正在使用Google Calendar API将Outlook中的日历事件同步到Google日历,添加和删除事件均正常,但创建重复事件时,API返回状态为OK,却仅生成单次非重复事件。我的VBA代码如下:
Dim d As New Scripting.Dictionary d.Add "kind", "calendar#event" d.Add "summary", Item.Subject d.Add "location", Item.Location d.Add "id", LCase(Item.EntryID) d.Add "description", Item.Body Dim d2(4) As New Scripting.Dictionary d2(0).Add "dateTime", Item.Start d.Add "start", d2(0) d2(1).Add "dateTime", Item.End d.Add "end", d2(1) d.Add "recurrence", RRuleString Dim Json As String Json = JsonConverter.ConvertToJson(d, Whitespace:=" ") ' send the json string via POST Set httpCall = CreateObject("MSXML2.ServerXMLHTTP") Dim sURL As String sURL = "https://www.googleapis.com/calendar/v3/calendars/<my gmail address>/events?sendNotifications=false&fields=etag%2ChtmlLink%2Cid&pp=1&access_token=" + AccessToken httpCall.Open "POST", sURL, False httpCall.setRequestHeader "Content-Type", "application/json;charset=UTF-8" httpCall.Send Json Dim sReturn As String sReturn = httpCall.responseText
初始RRuleString的值为"FREQ=DAILY;INTERVAL=2;UNTIL=20230226T083000",之后已修改为以RRULE:开头的格式,但问题仍未解决。
可能的原因
- Recurrence字段结构错误:Google Calendar API要求
recurrence是字符串数组,而非单个字符串。代码中直接将RRule字符串作为单个值传入,不符合API的参数结构要求。 - RRule格式细节不规范:即使添加了
RRULE:前缀,UNTIL参数的时间格式可能未遵循ISO 8601标准,缺少时区标识(如UTC的Z后缀或时区偏移),导致API无法解析重复规则。 - 事件ID冲突:使用Outlook的
EntryID作为Google事件ID时,若该ID对应的单次事件已存在,API可能会静默覆盖为单次事件,而非创建重复事件。
测试排查方法
修正Recurrence字段为数组格式
修改代码中recurrence的赋值逻辑,将其改为数组形式:' 替换原有的d.Add "recurrence", RRuleString Dim recurrences As Variant recurrences = Array(RRuleString) d.Add "recurrence", recurrences生成的JSON中
recurrence应呈现为["RRULE:FREQ=DAILY;INTERVAL=2;UNTIL=20230226T083000Z"]这样的数组结构。规范RRule的时间格式
- 确保RRule以
RRULE:开头 UNTIL参数必须使用UTC时间并添加Z后缀,例如UNTIL=20230226T083000Z;若使用本地时间,需指定时区偏移(如UNTIL=20230226T083000+08:00)- 可通过Google Calendar官网创建一个重复事件,调用API获取该事件的
recurrence字段,对比验证格式一致性。
- 确保RRule以
排查事件ID冲突问题
- 暂时注释掉
d.Add "id", LCase(Item.EntryID)代码行,让Google自动生成事件ID,测试是否能成功创建重复事件。 - 若自动ID可正常创建重复事件,说明原ID对应的事件已存在,需先删除旧事件再创建重复事件,或使用PATCH方法更新现有事件的
recurrence字段。
- 暂时注释掉
查看完整API返回与请求日志
- 移除URL中的
fields=etag%2ChtmlLink%2Cid参数,获取完整的事件返回数据,检查返回的recurrence字段是否正确。 - 打印生成的
Json字符串,确认recurrence为数组格式且RRule内容符合规范。
- 移除URL中的
内容的提问来源于stack exchange,提问作者Jonathan Small
相关产品推荐
相关产品推荐

