Google 日历 API 更新所有事件,而不仅仅是选定的事件

问题描述 投票:0回答:3

我当前的问题是我正在使用谷歌日历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)
    }

谢谢你。

javascript node.js google-calendar-api
3个回答
3
投票

文档中并不太清楚,但我通过分析事件在 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 中尝试它时,它的工作原理与描述的一样。奇怪的是,文档没有解释这些字段,所以我提交了一些反馈,希望他们将来能够澄清这一点。

来源:


0
投票

当您创建带有重复规则的事件时,它会创建一个带有 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 时,它将更新单个事件。


0
投票

我看到了你关于originalStartTime + recurentEventId的回答。这是我在互联网上找到的最好答案。但是,如何通过更新来更新 THIS_AND_FOLLOWING,例如,从定期会议中进行

© www.soinside.com 2019 - 2024. All rights reserved.