我当前的问题是我正在使用谷歌日历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)
}
谢谢你。
文档中并不太清楚,但我通过分析事件在 UI 中更改后在 API 中的外观,弄清楚了如何更改重复事件的单个实例。
正如您已经注意到的,使用
update
或 patch
会更改重复事件的所有实例。这是有道理的,因为重复事件仍然只有一个 ID,并且它们的重复是由其 recurrence[]
规则定义的。这样,当日历设置为每天无限制发生时,日历就不必创建可能无限量的新事件。
events.insert
方法来创建新事件,同时还指定它是对现有重复事件的修改。这是通过在请求正文中添加 recurringEventId
和 originalStartTime
字段来完成的。 recurringEventId
应是您要更改的重复事件的 ID,originalStartTime
应具有您要更改的特定实例的 startTime
和 timeZone
。
完整说明: 这是 API 中重复事件的示例,您可以通过在 UI 中创建一个事件并使用
events.list
检索它来找到该示例。实际输出更长,但我删除了一些不相关的字段:
{
"kind": "calendar#event",
"id": "<original-recurrent-event>",
"status": "confirmed",
"created": "2022-10-28T02:58:32.000Z",
"updated": "2022-10-28T02:58:32.287Z",
"summary": "Recurrent event",
"start": {
"dateTime": "2022-10-27T21:30:00-06:00",
"timeZone": "your-timezone"
},
"end": {
"dateTime": "2022-10-27T22:30:00-06:00",
"timeZone": "your-timezone"
},
"recurrence": [
"RRULE:FREQ=DAILY"
],
"eventType": "default"
}
上面显示的是每天重复发生的事件。它与其他活动的唯一区别是它有一个
recurrence
规则。我用 <original-recurrent-event>
占位符替换了实际 ID。
当我在 UI 中对此事件进行更改仅一天时,添加了一个新事件,如下所示:
{
"kind": "calendar#event",
"id": "<original-recurrent-event>_20221029T033000Z",
"status": "confirmed",
"created": "2022-10-28T02:58:32.000Z",
"updated": "2022-10-28T02:59:30.474Z",
"summary": "Modified event",
"start": {
"dateTime": "2022-10-28T21:00:00-06:00",
"timeZone": "your-timezone"
},
"end": {
"dateTime": "2022-10-28T22:00:00-06:00",
"timeZone": "your-timezone"
},
"recurringEventId": "<original-recurrent-event>",
"originalStartTime": {
"dateTime": "2022-10-28T21:30:00-06:00",
"timeZone": "your-timezone"
},
},
"eventType": "default"
}
这看起来非常像常规的新活动,但有一些差异:
id
并不是像往常一样随机生成的。相反,它由原始事件 ID 组成,并添加一个带有 UTC 原始开始时间的时间戳。recurringEventId
和 originalStartTime
。话虽如此,实际上您只需要插入一个新事件,其中的字段对您来说就像这样:
const res = await calendar.events.insert({ // use insert method
calendarId: 's',
requestBody: {
summary: 'Busy',
name: 'Busy',
start: {
dateTime: getEventStartTime
},
end: {
dateTime: getEventEndTime
},
recurringEventId:slotId,
originalStartTime:{
startTime:getOriginalStartTime,
timeZone:getTimezone
}
}
})
我自己没有 Node 环境来运行它,但我希望它能让您了解如何执行此操作。当我在文档页面的 API Explorer 中尝试它时,它的工作原理与描述的一样。奇怪的是,文档没有解释这些字段,所以我提交了一些反馈,希望他们将来能够澄清这一点。
当您创建带有重复规则的事件时,它会创建一个带有 id 的重复事件,我们称之为
<recurrent_event_id>
。如果您在更新或补丁中使用此 ID,它将更新所有重复项。要更新单个事件,您需要使用该事件的实例 ID。
您可以使用日历 API 的“instances”端点来检索重复事件的实例。
https://www.googleapis.com/calendar/v3/calendars/{calendarId}/events/{eventId}/instances
它将返回
items[]
属性,您可以在其中找到每个事件的 id 基本上看起来像 <recurrent_event_id>_20230601T120000
。
当您在 patch 调用中使用要编辑的事件的实例 ID 时,它将更新单个事件。
我看到了你关于originalStartTime + recurentEventId的回答。这是我在互联网上找到的最好答案。但是,如何通过更新来更新 THIS_AND_FOLLOWING,例如,从定期会议中进行