我目前的问题是我正在使用谷歌日历API。当我尝试修补一个事件时,API会更新所有未来的事件,而不仅仅是选定的事件。
我的项目是这样的,用户选择日历上的日期,然后请求发送到后端检索当天的所有事件。然后,用户可以单击该事件以确认它,并向服务器发送另一个请求。在请求期间,日历API应该只更新所单击事件的事件。
从我所做的研究,我认为我必须使用递归,然后EXDATE
,但我试图破译谷歌日历文档,并没有得到任何地方…
这是我迄今为止尝试过的代码。
adjustEventForTeacher = async(userCalendarLocation, slotId) => {
let getEventStartTime = await calendar.events.get({
calendarId: 's',
eventId: slotId
})
const getEventEndTime = getEventStartTime.data.end.dateTime
getEventStartTime = getEventStartTime.data.start.dateTime
console.log(getEventStartTime)
const res = await calendar.events.patch({
calendarId: 's',
eventId: slotId,
requestBody: {
summary: 'Busy',
name: 'Busy',
status: 'confirmed',
colorId: '0',
// start: {
// dateTime: getEventStartTime
// },
// end: {
// dateTime: getEventEndTime
// }
// recurrence: [ `EXDATE;VALUE=DATE:${getEventStartTime}` ],
}
})
console.log(res.data)
}
谢谢你。
2条答案
按热度按时间ubof19bj1#
这在文档中不是很清楚,但我通过分析事件在UI中被更改后在API中的样子,找到了如何更改重复事件的单个示例。
正如您已经注意到的,使用
update
或patch
会更改重复事件的所有示例。这是有意义的,因为循环事件仍然只有一个ID,并且它们的循环由它们的recurrence[]
规则定义。这样,日历就不必创建潜在的无限数量的新事件,当它们被设置为每天无限制地发生时。诀窍在于,您必须使用
events.insert
方法来创建一个新事件,同时还指定它是对现有重复事件的修改。这是通过在请求正文中添加recurringEventId
和originalStartTime
字段来完成的。recurringEventId
应该是要更改的重复事件的ID,originalStartTime
应该具有要更改的特定示例的startTime
和timeZone
。**详细说明:**这里是一个API中的循环事件示例,您可以在UI中创建一个,然后使用
events.list
检索它。实际输出更长,但我削减了一些不相关的字段:上图显示了每日复发事件。它与其他事件的唯一区别是它有一个
recurrence
规则。我将实际ID替换为<original-recurrent-event>
占位符。当我在UI中对这个事件进行更改时,只有一天添加了一个新事件,看起来像这样:
这看起来很像一个常规的新事件,但有一些不同:
id
不是像往常一样随机生成的。相反,它由原始事件ID组成,并添加一个时间戳,其中包含原始开始时间(UTC)。recurringEventId
和originalStartTime
。说了这么多,实际上你只需要插入一个新的事件,这些字段看起来像这样:
我自己没有一个Node环境来运行这个,但我希望它能给你一个如何做到这一点的想法。当我在文档页面的APIs Explorer中尝试它时,它就像描述的那样工作。奇怪的是,文档并没有解释这些字段,所以我提交了一些反馈,希望他们能在未来澄清这一点。
来源:
dy2hfwbg2#
当你创建一个带有循环规则的事件时,它会创建一个带有id的循环事件,我们称之为
<recurrent_event_id>
。如果在update或patch中使用此id,它将更新所有重复出现的事件。要更新单个事件,您需要使用该事件的示例ID。您可以使用Calendar API的' instances '端点来检索重复事件的示例。
https://www.googleapis.com/calendar/v3/calendars/{calendarId}/events/{eventId}/instances
它将返回
items[]
属性,您可以在其中找到每个事件的ID,基本上看起来像<recurrent_event_id>_20230601T120000
。当您在patch调用中使用要编辑的事件的示例id时,它将更新单个事件。