脚本:如何跳过包含不完整数据集的Google表格行

时间:2018-02-06 01:15:29

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

我正在跟踪当地的立法会议工作,这需要监控和调整300多个账单和计数的日历事件(在会话结束时计算800+)。我从几个来源编译了一个脚本,这张表给我节省了大量的时间。

它复制事件的日历ID以避免创建重复事件。除了一件事之外,它的工作非常好 - 对于没有在第8列和第8列中指定的日期/时间的任何账单。分别为9,脚本在1969年3月0日创建一个日历事件。

我想要脚本:

A)只是跳过处理第9列中的单元格为空的所有行,或

B)获取过滤视图的范围,仅为那些可见的行创建事件。

如果可能的话,我更喜欢B。我尝试了一些东西,但我很茫然。虽然我可以手动将仅将日历事件粘贴到另一个工作表并在那里运行脚本而没有任何问题,但我宁愿它比这简单。任何帮助将不胜感激。

现有代码:

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Export Calendared Bills",
    functionName : "exportEvents"
  }];
  sheet.addMenu("Calendar Actions", entries);
};



function exportEvents() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var headerRows = 2;  
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "redactedaddress@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calId);
  for (i=0; i<data.length; i++) {
    if (i < headerRows) continue; 
    var row = data[i];
    var date = new Date(row[8]);  
    var title = row[2];           
    var tstart = new Date(row[9]);
    tstart.setDate(date.getDate());
    tstart.setMonth(date.getMonth());
    tstart.setYear(date.getYear());
    var tstop = new Date(row[9]);
    tstop.setDate(date.getDate());
    tstop.setMonth(date.getMonth());
    tstop.setYear(date.getYear());
    var loc = row[4];
    var desc = row[15];
    var id = row[3];  
    try {
      var event = cal.getEventSeriesById(id);
    }
    catch (e) {

    }
    if (!event) {

      var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc,}).getId();
      row[3] = newEvent; Utilities.sleep(1000);  
    }
    else {
      event.setTitle(title);
      event.setDescription(desc);
      event.setLocation(loc);
    }
    debugger;
  }
  range.setValues(data);
}

1 个答案:

答案 0 :(得分:0)

您可以使用date.valueOf()函数和isNaN()函数检查日期对象是否为有效日期,如here所示。 如果日期有效,valueOf()函数会返回一个数字,您可以使用isNaN()函数检查数字

最后,当日期无效时,您可以使用continue跳过该特定迭代。像这样:

var tstart = new Date(row[9])
if(isNaN(tstart.valueOf()))
  continue;

您的最终代码如下所示:

function exportEvents() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var headerRows = 2;  
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "redactedaddress@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calId);
  for (i=0; i<data.length; i++) {
    if (i < headerRows) continue; 
    var row = data[i];
    var date = new Date(row[8]);  
    var title = row[2];           
    var tstart = new Date(row[9]);
    if(isNaN(tstart.valueOf()))
      continue;                // skip row, go to the next row
    tstart.setDate(date.getDate());
    tstart.setMonth(date.getMonth());
    tstart.setYear(date.getYear());
    var tstop = new Date(row[9]);
    tstop.setDate(date.getDate());
    tstop.setMonth(date.getMonth());
    tstop.setYear(date.getYear());
    var loc = row[4];
    var desc = row[15];
    var id = row[3];  
    try {
      var event = cal.getEventSeriesById(id);
    }
    catch (e) {

    }
    if (!event) {

      var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc,}).getId();
      row[3] = newEvent; Utilities.sleep(1000);  
    }
    else {
      event.setTitle(title);
      event.setDescription(desc);
      event.setLocation(loc);
    }
    debugger;
  }
  range.setValues(data);
}