AppScript:Google 日历删除事件
AppScript: Google Calendar Remove Events
我有以下代码将我的活动从 Google Sheet 上传到 Google 日历。此代码根据 E 列(状态)x[4]
中的值搜索需要同步到日历的行。标记为 Pending Schedule
或 Pending Removal
的事件将同步到日历,然后将 sheet 中的相应行更新为 Scheduled
或 Removed
。
这段代码在安排事件方面运行得很好。但是,当涉及到删除事件时,它仅在数据的第一行被标记为要删除时才有效,但在其他行上则无效。它给了我 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
}
因此,经过一些挖掘,我认为我需要创建另一个循环来删除事件。所以下面的代码:
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';
}
}
我有以下代码将我的活动从 Google Sheet 上传到 Google 日历。此代码根据 E 列(状态)x[4]
中的值搜索需要同步到日历的行。标记为 Pending Schedule
或 Pending Removal
的事件将同步到日历,然后将 sheet 中的相应行更新为 Scheduled
或 Removed
。
这段代码在安排事件方面运行得很好。但是,当涉及到删除事件时,它仅在数据的第一行被标记为要删除时才有效,但在其他行上则无效。它给了我 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
}
因此,经过一些挖掘,我认为我需要创建另一个循环来删除事件。所以下面的代码:
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';
}
}