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

ygya80vv  于 2023-06-05  发布在  Node.js
关注(0)|答案(2)|浏览(497)

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

谢谢你。

ubof19bj

ubof19bj1#

这在文档中不是很清楚,但我通过分析事件在UI中被更改后在API中的样子,找到了如何更改重复事件的单个示例。
正如您已经注意到的,使用updatepatch会更改重复事件的所有示例。这是有意义的,因为循环事件仍然只有一个ID,并且它们的循环由它们的recurrence[]规则定义。这样,日历就不必创建潜在的无限数量的新事件,当它们被设置为每天无限制地发生时。
诀窍在于,您必须使用events.insert方法来创建一个新事件,同时还指定它是对现有重复事件的修改。这是通过在请求正文中添加recurringEventIdoriginalStartTime字段来完成的。recurringEventId应该是要更改的重复事件的ID,originalStartTime应该具有要更改的特定示例的startTimetimeZone

**详细说明:**这里是一个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规则。我将实际ID替换为<original-recurrent-event>占位符。
当我在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)。
  • 它有我前面提到的字段recurringEventIdoriginalStartTime

说了这么多,实际上你只需要插入一个新的事件,这些字段看起来像这样:

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环境来运行这个,但我希望它能给你一个如何做到这一点的想法。当我在文档页面的APIs Explorer中尝试它时,它就像描述的那样工作。奇怪的是,文档并没有解释这些字段,所以我提交了一些反馈,希望他们能在未来澄清这一点。

来源:
dy2hfwbg

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时,它将更新单个事件。

相关问题