如何使用 Google Calendar API v3 (JavaScript) 删除事件通知

How to remove event notification using Google Calendar API v3 (JavaScript)

我有以下JSON

var resource = {
  "summary": "Sample Event",
  "start": {
    "dateTime": sample1
  },
  "end": {
    "dateTime": twoHoursLater
  },
  "reminders": {
    "useDefault": false,
    "overrides": [
      {
        "method": "popup",
        "minutes": "5"
      },
      {
        "method": "email",
        "minutes": "5"
      }

    ]
  }
};

我可以使用下面的代码将它插入到 Google 日历中

function addEvent() {
  gapi.client.load('calendar', 'v3', function() {
    var request = gapi.client.calendar.events.insert({
      'calendarId':   calendarId,
      'resource':     resource
    });
    request.execute(function(resp) {
      console.log(resp);
    });
  });
}

在 Google 日历网站中显示为:

5 minutes before, as email
5 minutes before

如您所见,我的活动有提醒,这意味着它将在活动开始前 5 分钟通过弹出窗口和电子邮件通知。

现在,我想使用 API.

以编程方式删除此事件提醒

到目前为止我已经尝试过:

测试 1:

基于文档https://developers.google.com/calendar/concepts/reminders

它说 "To revert back to the default set of reminders, perform an update setting reminders.useDefault back to true."

var resource3 = {
  "summary": "Sample Event xx",
  "start": {
    "dateTime": sample1
  },
  "end": {
    "dateTime": twoHoursLater
  },
  "reminders": {
    "useDefault": true
  }
};

function updateEvent(eventId) {
  gapi.client.load('calendar', 'v3', function() {
    var request = gapi.client.calendar.events.patch({
      'calendarId':   calendarId,
      'eventId':     eventId,
      'resource':     resource3
    });
    request.execute(function(resp) {
      console.log(resp);
    });
  });
}

上面的代码将在控制台中 return 一个错误 Cannot specify both default reminders and overrides at the same time.

测试 2:

基于 Whosebug 上接受的答案

它说“因此我认为你可以设置 "useDefault": false 并且不提供任何覆盖,它应该会导致事件没有提醒。"

var resource3 = {
  "summary": "Sample Event xx",
  "start": {
    "dateTime": sample1
  },
  "end": {
    "dateTime": twoHoursLater
  },
  "reminders": {
    "useDefault": false
  }
};

function updateEvent(eventId) {
  gapi.client.load('calendar', 'v3', function() {
    var request = gapi.client.calendar.events.patch({
      'calendarId':   calendarId,
      'eventId':     eventId,
      'resource':     resource3
    });
    request.execute(function(resp) {
      console.log(resp);
    });
  });
}

patching/updating 适用于其他领域,例如 summarystartend。但它不会删除事件提醒。

测试 3:

这是我目前试验过的。我完全删除了提醒。仍然没有运气。与测试 2 中的输出相同。

var resource3 = {
  "summary": "Sample Event xx",
  "start": {
    "dateTime": sample1
  },
  "end": {
    "dateTime": twoHoursLater
  }
};

unction updateEvent(eventId) {
  gapi.client.load('calendar', 'v3', function() {
    var request = gapi.client.calendar.events.patch({
      'calendarId':   calendarId,
      'eventId':     eventId,
      'resource':     resource3
    });
    request.execute(function(resp) {
      console.log(resp);
    });
  });
}

您知道如何删除事件提醒吗?

所以在解决它之后,我成功地使用 API 删除了事件通知。正如 测试 2 中所述,答案几乎接近,它是通过使用以下代码完成的:

var resource3 = {
  "summary": "Sample Event xx",
  "start": {
    "dateTime": sample1
  },
  "end": {
    "dateTime": twoHoursLater
  },
  "reminders": {
    "useDefault": false,
    "overrides": []
  }
};

function updateEvent(eventId) {
  gapi.client.load('calendar', 'v3', function() {
    var request = gapi.client.calendar.events.patch({
      'calendarId':   calendarId,
      'eventId':     eventId,
      'resource':     resource3
    });
    request.execute(function(resp) {
      console.log(resp);
    });
  });
}

我只需要添加 overrides 并给它一个空值。如果您遇到同样的问题,希望这对您有所帮助。

试试这个:

var resource3 = {
  "summary": "Sample Event xx",
  "start": {
    "dateTime": sample1
  },
  "end": {
    "dateTime": twoHoursLater
  },
  "reminders": {
    "useDefault": false,
    "overrides": []
  }
};

function updateEvent(eventId) {
  gapi.client.load('calendar', 'v3', function() {
    var request = gapi.client.calendar.events.patch({
      'calendarId':   calendarId,
      'eventId':     eventId,
      'resource':     resource3
    });
    request.execute(function(resp) {
      console.log(resp);
    });
  });
}

使用库进行修补时,您不能只将覆盖设置为 null,您需要使用 Data.nullOf(ArrayList.class):

 Event.Reminders reminders = new Event.Reminders()
                        .setUseDefault(false)
                        .setOverrides(Data.nullOf(ArrayList.class));
                newEvent.setReminders(reminders);

根据我的经验,patch/update 对于

之后的事件
reminders: {
  useDefault: false,
  overrides: []
}

仅适用于 Firefox,而 Chrome 顽固地坚持默认设置。 (超级莫名其妙,我查了好几遍:同一个事件在Firefox和Chrome中查看时会有不同的提醒。)

我解决这个问题的方法是首先不创建事件,而是使用日历 API:

const event = {
  start: {...},
  end: {...},
  summary: 'My Event',
  reminders: {
    useDefault: false
  }
}
Calendar.Events.insert(event, calendarId)

这意味着我不能使用(稍微容易一些)Calendar service provided by Google in the app scripts,但是 API 也不错。