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

Script: How to skip Google Sheets rows with incomplete data sets

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

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

我希望脚本:

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

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

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

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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 ="[email protected]";
  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);
}

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

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

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

您的最终代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function exportEvents() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var headerRows = 2;  
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId ="[email protected]";
  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);
}