我有一个带有两个功能的Google Sheet运行的GAS脚本。第一个函数在两个日期之间的命名日历中下载日历事件详细信息。从单元格A2,B2和C2分别读入日历的名称,开始日期和结束日期。这个功能运行正常:
//Function to list certain events in your GCalendar.
function listMyEvents() {
var sheet = SpreadsheetApp.getActiveSheet();
var calid = sheet.getRange("A2").getValue();
if(calid == null) {
SpreadsheetApp.getActiveSpreadsheet().toast('Please enter a valid calendar name!');
return;
}
var startTime = sheet.getRange("B2").getValue();
if(startTime == 0) {
SpreadsheetApp.getActiveSpreadsheet().toast('Please enter a start date!');
return;
}
if(isNaN(startTime)) {
SpreadsheetApp.getActiveSpreadsheet().toast('Please enter a valid start date!');
return;
}
var endTime = sheet.getRange("C2").getValue();
if(endTime == 0) { //If the cell doesn't contain anything send an error prompt
SpreadsheetApp.getActiveSpreadsheet().toast('Please enter an end date');
return;
}
if(isNaN(endTime)) { //If the cell holds text rather than a number then send an error prompt
SpreadsheetApp.getActiveSpreadsheet().toast('Please enter a valid end date!');
return;
}
var calendar = CalendarApp.getCalendarsByName(calid)[0]; //get the calendar name
var events = calendar.getEvents(startTime, endTime);
var data; //declare a variable to hold all the information.
for(var i = 0; i < events.length;i++){
var event = events[i];
data = [
event.getTitle(),
event.getDescription(),
event.getStartTime(),
event.getEndTime(),
event.getLocation(),
event.getId(),
"N"
];
sheet.appendRow(data);
}
sheet.autoResizeColumn(1);
sheet.autoResizeColumn(2);
sheet.autoResizeColumn(3);
sheet.autoResizeColumn(4);
sheet.autoResizeColumn(5);
sheet.autoResizeColumn(6);
sheet.autoResizeColumn(7);
}
第二个函数尝试从F列读入事件ID,以便在写回Google Calendar之前允许在表单中修改单个事件。但是,calendarEvent.getId()
行上的脚本错误,错误为Cannot call method "getId" of undefined. (line 118, file "Code")
。
我确实读过您需要使用.getEventSeriesById()
方法 - 但事件不是系列中的!是否可以使用脚本修改单个事件,还是需要删除所有事件并通过修改重新创建它们?我的第二个函数的代码在这里:
function amendCalEvents() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 6; // First row of data to process
var numRows = sheet.getLastRow(); // Number of rows to process
//var maxRows = Math.min(numRows,200); //Limit the number of rows to prevent enormous number of event creations
var calid = sheet.getRange("A2").getValue(); //putting the calendar name in double quotes creates double entries. Who knew?
var dataRange = sheet.getRange(startRow, 1, numRows, 7); //startRow, startCol, endRow, endCol
var data = dataRange.getValues();
var cal = CalendarApp.getCalendarsByName(calid)[0]; //get the calendar name
for (i in data) {
var row = data[i];
var title = row[0]; // column A
var desc = row[1]; // column B
var tstart = row[2]; // column C
var tstop = row[3]; // column D
var loc = row[4]; // column E
var evId = row[5]; // column F
var evDelFlag = row[6]; // column G
var event = cal.calendarEvent.getId(evId);
if (evDelFlag == "N" || evDelFlag == "n") {
event.setTitle(title);
event.setDescription(desc);
event.setTime(tstart, tstop);
event.setLocation(loc);
} else {
cal.getId(evId).deleteEvent;
}
}
}
非常感谢任何帮助或指示。
答案 0 :(得分:1)
您可以在函数amendCalEvents
中进行一些更改1.- numRows变量,您正在设置getLasRow的值但是您没有减去用于第一个信息的行(例如,如果您只有1个日历,并且此日历有一个事件,当您运行第一个函数时将添加一个新行,此变量将具有3作为值。 因此,当你调用函数getRange时,它将带来3行的信息,而不仅仅是带有信息的信息。
2.-使用getEventSeriesById的解决方法,你可以像第一次使用那样再次调用函数getEvents。 由于您已经使用相似数量的数据在for中循环,因此您可以访问数组o事件中的元素并设置所需的值。
var event = events[i];
3.-删除活动现在可以致电:
event.deleteEvent();
希望这有帮助