【问题标题】:AppScript: Google Calendar Remove EventsAppScript:谷歌日历删除事件
【发布时间】:2022-01-12 00:22:01
【问题描述】:

我有以下代码可将我的活动从 Google 表格上传到 Google 日历。此代码根据 E 列(状态)x[4] 中的值搜索需要同步到日历的行。标记为Pending SchedulePending Removal 的事件将同步到日历,然后使用ScheduledRemoved 更新工作表中的相应行。

这段代码在调度事件方面运行良好。但是,当涉及到删除事件时,它仅在数据的第一行被标记为要删除时才有效,而在其他行上则无效。它给了我TypeError: Cannot read property 'deleteEvent' of undefined,当我调查deleteEvent 对象时显示为CalendarEvent

似乎我编写if() 函数的方式不合适,else if() 不会评估整个数据。我尝试用另一个if() 替换else if(),但收到了同样的错误。

function calendarSync2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = ss.getSheetByName('Test Sheet')
  var settingsSheet = ss.getSheetByName('Calendar Settings');
  var calendarId = settingsSheet.getRange('B2').getValues();
  var eventCal = CalendarApp.getCalendarById(calendarId);
  var eventArray = dataSheet.getRange('A2:I').getDisplayValues();

  for (x = 0; x < eventArray.length; x++) {

    var event = eventArray[x];
    var eventName = event[1];
    var eventDate = new Date(event[0]);
    var timeZone = event[5];
    var startTime = new Date(`${event[0]} ${event[2]} ${timeZone}`); ///Used Object literals of `` combined with ${}
    var endTime = new Date(`${event[0]} ${event[3]} ${timeZone}`);
    var status = event[4]; // Used in the following comparison expression instead of filter

    if (status === 'Pending Schedule') { /// === undertakes strict comparison
      var exisEvents = eventCal.getEvents(startTime, endTime, {search: eventName});  // prevents creation of duplicates
      if (exisEvents.length == 0) {
        Logger.log(`timed ${eventName} scheduled for: ${startTime} till ${endTime}`);
        eventCal.createEvent(eventName, startTime, endTime);
        eventArray[x][4] = "Scheduled"; // Updates the status
      }
    } else if (status === 'Pending Removal') {
      Logger.log(`${eventName} at ${eventDate} REMOVED`)
      var returnedEvent = eventCal.getEvents(startTime, endTime, {search: eventName});
      var toRemove = returnedEvent[x];
      Logger.log(`returnedEvent is: ${returnedEvent}`);
      toRemove.deleteEvent();
      eventArray[x][4] = "Removed";
    }
  }
  dataSheet.getRange('A2:I').setValues(eventArray); // Overwrite the source data with the modified array
}

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,我无法理解But when it comes to removing events it only works if the first row of the data is marked to be removed, but not on other rows.。可以问一下具体情况吗?
  • 您的日志是否都符合预期?你能检查startTimeendTime的值吗?
  • @Ihopethisishelpfultoyou 我检查了 startTime 和 endTime 的日志,它们工作得很好。

标签: javascript google-apps-script google-sheets google-calendar-api


【解决方案1】:

所以通过一点点挖掘,我想我需要创建另一个循环来删除事件。所以下面的代码:

else if (status === 'Pending Removal') {
      var returnedEvent = eventCal.getEvents(startTime, endTime, {search: eventName});
      var toRemove = returnedEvent[x];
      toRemove.deleteEvent();
      eventArray[x][4] = "Removed";
    }

应改为:

else if (status === 'Pending Removal') {
      var returnedEvents = eventCal.getEventsForDay(eventDate,
{search: eventName});
      for (i = 0; i < returnedEvents.length; i++) {
        var toRemove = returnedEvents[i];
        toRemove.deleteEvent();
        eventArray[x][4] = 'Removed';
      }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多