通过脚本创建新事件时覆盖现有 google 日历事件

Override existing google calendar event when new event is created via script

我正在使用 Google 表格根据我的 Google 日历上的开放事件安排约会。我在日历上划分了时间段,如果事件的标题是 "Open",那么时间段可以用来创建事件。接下来我想知道是否可以使用创建的新约会覆盖和删除现有的开放事件。

这是我用来将事件推送到我的日历的代码,因为它们是以以下形式创建的:

var calendarID = "";
var startDtID = 5;
var endDtID = 5; // Column containing date/time
var nameID = 2; // Column containing name
var emailID = 3; // Column containing email
var phoneID = 4; // Column containing phone
var formTimeStampID = 1; // column containing timestamp

function getLatestAndSubmitToCalendar() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var lr = rows.getLastRow();

  var startDt = sheet.getRange(lr,startDtID,1,1).getValue();
  var endDt = sheet.getRange(lr,endDtID,1,1).getValue(); // remove hour and minute for the start/end time
  var desc = "Comments :"+sheet.getRange(lr,phoneID,1,1).getValue(); // set comments as description, add in timestamp and submission
  var title = sheet.getRange(lr,nameID,1,1).getValue()+" - "+sheet.getRange(lr,emailID,1,1).getValue(); // create title using name and email

    createEvent(calendarID,title,startDt,endDt,desc);
}; // run create event function

function createEvent(calendarId,title,startDt,endDt,desc) {
  var cal = CalendarApp.getCalendarById(calendarID);
  var start = new Date(startDt);
  var end = new Date(endDt);

  var event = cal.createEvent(title, start, end, {
      description : desc
  }); // set options for event
};

CalendarEvent class 具有通过 deleteEvent() 删除事件的方法,但我对如何确定要删除的正确事件感到困惑。如何将当前事件的日期和时间与已经存在的事件的日期和时间相匹配,以便覆盖它?

您需要先调用 calendar.getEvents(),然后遍历要删除的事件,并对每个事件调用 .delete()。这是 API link:https://developers.google.com/apps-script/reference/calendar/calendar#getEvents%28Date,Date,Object%29

像这样:

var now = new Date();
var twoHoursFromNow = new Date(now.getTime() + (2 * 60 * 60 * 1000));
var events = CalendarApp.getDefaultCalendar().getEvents(now, twoHoursFromNow,
    {search: 'meeting'});

for(int i = 0; i < events.length; i++){
    if this is the right event (compare title, times, etc?){
        events[i].deleteEvent();
    }
}

在这种情况下,您可能需要比较描述。另请注意,您可以将选项传递给 getEvents 调用;您可以在搜索过程中用于过滤的一个参数是搜索参数,就像我在上面所做的那样。它过滤该文本的返回事件。

编辑:理想情况下,你会想要使用这个:https://developers.google.com/apps-script/reference/calendar/calendar#getEventSeriesById%28String%29

即通过ID获取事件;我的回答是假设您没有将 ID 存储在任何地方。如果你这样做了,那就更好了,你会确定你正在替换正确的事件。

有效!这是我完成的添加事件和删除同时发生的事件的代码。

function createEvent(calendarId,title,startDt,endDt,desc) {
  var cal = CalendarApp.getCalendarById(calendarID);
  var start = new Date(startDt);
  var end = new Date(endDt);

  var event = cal.createEvent(title, start, end, {
    description : desc
  });

    var events = cal.getEvents(start, end, {
    search: 'open'
  });  

  for (i in events){
    events[i].deleteEvent();
  }
};