【问题标题】:Google calendar api: recurring events exceptions + master event update谷歌日历api:重复事件异常+主事件更新
【发布时间】:2020-06-23 10:25:28
【问题描述】:

我有一个具有以下场景的应用:

  • 用户在我的应用程序的谷歌日历中创建了一个定期事件(通过谷歌日历 API v3)
  • 他们更改其中一个实例的时间(这会创建异常实例 - 以一种很好的方式“异常”)
  • 现在他们想要延长该定期活动,并更改主活动的计数或结束日期

问题是在最后一步之后所有异常都消失了(日历 UI 似乎可以处理,但如果通过 API 完成,异常就消失了)。不过,我注意到 Outlook 可以通过他们的 API 很好地管理该案例。

是否有任何简单的方法可以通过 API 在谷歌日历中保留这种情况下的异常?

我还注意到,如果我在更新主节点后尝试进一步更新原始异常之一,则会出现错误(错误的“异常”)并指出实例事件因此被标记为已删除无法更新('get' 仍然返回它)。在这种情况下,它创建了一个新的实例事件,用一个新的 id 代替原来的。

更新

更新主事件的伪代码如下所示:

let originalMastEvent = {
        id:"google_generated_master_event_id",
        ...
        recurrence: [ 'RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE,SA;COUNT=6' ],
        ...
}

//change the count from 6 to 10, the rest stays the same:

let newMastEvent = {
    id:"google_generated_master_event_id",
    summary: 'Summary',
    start: { dateTime: '2020-06-24T01:00:00+02:00', timeZone: 'UTC' },
    end: { dateTime: '2020-06-24T02:00:00+02:00', timeZone: 'UTC' },
    recurrence: [ 'RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE,SA;COUNT=10' ],
    sendUpdates: 'all',
    attendees:[ { email: 'attendee1@gmail.com'} ]
}

const {google} = require('googleapis/build/src/index'); //I'm on node.js

let auth = {...} //setup google api oauth obj
let calendar = await google.calendar({version: 'v3', auth});

let res = await calendar.events.update({
    calendarId: 'primary',
    eventId: newMastEvent.id,
    resource: newMastEvent,
    sendUpdates: newMastEvent.sendUpdates
})

【问题讨论】:

  • 你好@virus,事件的扩展是如何完成的?你能提供更多信息吗?
  • 嗨@ale13 - 可以说这是一个受出现次数限制的事件。然后我只更新重复模式的 COUNT 值并调用事件更新 api (developers.google.com/calendar/v3/reference/events/update)。如果这没有帮助,请告诉我,我将粘贴一个包含更多详细信息的伪代码。
  • 你可以发布你用于更新的sn-p吗?
  • @ale13 用代码更新了我的答案
  • 您究竟是如何为主要事件创建例外的?就像您提到的那样,我尝试通过扩展它来更新带有异常的重复事件,但异常仍然存在。你有更多可以帮助的细节吗? @病毒

标签: google-calendar-api google-calendar-recurring-events


【解决方案1】:

您的问题与您如何添加例外以及您更新主要事件的方式有关。

根据此页面here,您需要在插入异常时使用POST 请求。

因此,您将不得不使用Events:insert 请求:

POST https://www.googleapis.com/calendar/v3/calendars/calendarId/events

具有以下主体:

{
  "start": {
    "dateTime": "MODIFIED_START_DATE",
    "timeZone": "YOUR_TIMEZONE"
  },
  "end": {
    "dateTime": "MODIFIED_END_DATE",
    "timeZone": "YOUR_TIMEZONE"
  },
  "recurringEventId": "ID_OF_THE_RECURRENT_EVENT",
  "originalStartTime": {
    "dateTime": "ORIGINAL_DATE_TIME",
    "timeZone": "YOUR_TIMEZONE"
  },
  "iCalUID": "ID",
}

之后,如果你想更新主事件,例如增加出现次数,你可以简单地向下面的请求:

PUT https://www.googleapis.com/calendar/v3/calendars/calendarId/events/eventId

具有以下主体:

{
  "start": {
    "dateTime": "START_DATE_OF_THE_ORIGINAL_EVENT",
    "timeZone": "YOUR_TIMEZONE"
  },
  "end": {
    "dateTime": "END_DATE_OF_THE_ORIGINAL_EVENT",
    "timeZone": "YOUR_TIMEZONE"
  },
  "recurrence": [
    "RRULE:FREQ=WEEKLY;WKST=SU;COUNT=3;BYDAY=FR"
  ]
}

在完成上述请求后,您应该能够在进行事件扩展的同时仍然保留异常。

参考

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多