故障排除脚本以修改Google表格中的Google日历

时间:2014-11-10 19:38:44

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

我有一个带有两个功能的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;
      } 

 }
}

非常感谢任何帮助或指示。

1 个答案:

答案 0 :(得分:1)

您可以在函数amendCalEvents

中进行一些更改

1.- numRows变量,您正在设置getLasRow的值但是您没有减去用于第一个信息的行(例如,如果您只有1个日历,并且此日历有一个事件,当您运行第一个函数时将添加一个新行,此变量将具有3作为值。 因此,当你调用函数getRange时,它将带来3行的信息,而不仅仅是带有信息的信息。

2.-使用getEventSeriesById的解决方法,你可以像第一次使用那样再次调用函数getEvents。 由于您已经使用相似数量的数据在for中循环,因此您可以访问数组o事件中的元素并设置所需的值。

var event = events[i];

3.-删除活动现在可以致电:

event.deleteEvent();

希望这有帮助