Google表数据到日历 - 处理空或不正确的日期

时间:2018-01-11 17:37:49

标签: javascript google-apps-script

我有一个Google表格文档,其中电子表格中的每个表格都指向不同的文件。范围B3:E5始终用于关键截止日期,日期和相关的Google日历条目,如下所示:

B3:C3 (merged): Description; D3: Date; E3: [randomnumbers]@google.com  
B4:C4 (merged): Description; D4: Date; E4: [randomnumbers]@google.com  
B5:C5 (merged): Description; D5: Date; E5: [randomnumbers]@google.com  

我有一个脚本,用于检查该范围的E列中引用的日历条目,如果不存在则创建一个,或者更新条目(如果存在),其中包含来自B:D中日期和描述的信息。它是Create Google Calendar Events from Spreadsheet but prevent duplicates的最佳答案的修改形式。

我的问题是那些细胞并不总是包含信息(例如,我可能在第3行和第5行中有信息,但在第4行中没有信息)。在这种情况下,脚本仍会创建三个日历条目,但与空条目相关联的条目(例如第4行中的条目)设置为" 1969年12月31日和#34;。

我想建立一种方法来捕捉这些空日期(或错误的日期,其中脚本可以正确地将D列解释为日历条目的日期,例如创建拼写错误的日期" Apriil 4,2018",也产生1969年12月31日的条目),如果输入错误或者没有创建没有数据条目的事件,则输出错误。

这是我的剧本,里面有一些评论。我非常感谢你们给予的任何帮助。强制性的#34;不是特别精通Javascript,因此我经常笨拙的Google-fu"。

function exportEvents() {
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange(3, 2, 3, 4); // Range: Key Deadlines Description and Dates (B3:E6)
  var fileno = sheet.getSheetName();
  var data = range.getValues();
  var calID = "[calIDinformation]@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calID);
  var formulas = sheet.getRange(3, 2, 1, 3).getFormulas(); // Snagging one line of formulae which get broken in this process; tofix?
  for (i=0; i<data.length; i++) {
    var row = data[i];
    var description = row[0];     // First column (B - "Description")
    var date = new Date(row[2]);  // Third column (D - "Date")
    var id = row[3];              // Fourth column (E - Dates, written in white)
    // Check if event already exists, update it if it does
    try {
      var event = cal.getEventById(id);
    }
    // Catches an exception if no event exists
    catch (e) {
    }
    if (!event) {
      var newEvent = cal.createAllDayEvent(fileno+' - '+description, date).getId();
      row[3] = newEvent;  // Update the data array with event ID
    }
    else {
      event.setTitle(fileno+' - '+description);
      event.setAllDayDate(date);
    }
    debugger;
  }
  // Record all event IDs to spreadsheet and restore formulas in first row
  range.setValues(data);
  sheet.getRange(3, 2, 1, 3).setFormulas(formulas);
}

1 个答案:

答案 0 :(得分:0)

您可以将以下代码添加到循环中以跳过无效日期

if(date.toString() == "Invalid Date")
      continue;

基本上,documentation语句会导致循环跳过该迭代。

注意:这适用于日期中的空白或拼写错误(但尚未测试所有可能的结果)

您的最终代码如下所示:

function exportEvents() {
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange(3, 2, 3, 4); // Range: Key Deadlines Description and Dates (B3:E6)
  var fileno = sheet.getSheetName();
  var data = range.getValues();
  var calID = "[calIDinformation]@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calID);
  var formulas = sheet.getRange(3, 2, 1, 3).getFormulas(); // Snagging one line of formulae which get broken in this process; tofix?
  for (i=0; i<data.length; i++) {
    var row = data[i];
    var description = row[0];     // First column (B - "Description")
    var date = new Date(row[2]);  // Third column (D - "Date")
    if(date.toString() == "Invalid Date")
          continue;                   // Skip remaining loop for this iteration

    var id = row[3];              // Fourth column (E - Dates, written in white)
    // Check if event already exists, update it if it does
    try {
      var event = cal.getEventById(id);
    }
    // Catches an exception if no event exists
    catch (e) {
    }
    if (!event) {
      var newEvent = cal.createAllDayEvent(fileno+' - '+description, date).getId();
      row[3] = newEvent;  // Update the data array with event ID
    }
    else {
      event.setTitle(fileno+' - '+description);
      event.setAllDayDate(date);
    }
    debugger;
  }
  // Record all event IDs to spreadsheet and restore formulas in first row
  range.setValues(data);
  sheet.getRange(3, 2, 1, 3).setFormulas(formulas);
}

编辑:

要分别评估空白和拼写错误,您可以插入如下代码:

 if(date.toString() == "Invalid Date"){
          if(row[2].trim() == ""){ //if the cell is blank skip it
            continue;
          } else {                 //If the date entered is wrong, highlight it red
            range.getCell(i+1,3).setBackground("Red") 
            continue;
          }
 }

这将跳过空白并突出显示无效日期的单元格(红色)。