【问题标题】:Google Sheet Data to Calendar - Handling Empty or Incorrect DatesGoogle 工作表数据到日历 - 处理空日期或不正确日期
【发布时间】:2018-01-11 17:37:48
【问题描述】:

我有一个 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 日”。

我想建立一种方法来捕获这些空日期(或错误日期,其中脚本无法正确地将 D 列解释为日历条目的日期,例如,其中一个错字创建了“4 月 4 日, 2018”,它还会生成 1969 年 12 月 31 日的条目),并且在输入错误的情况下会出错,或者不会为没有数据条目创建事件。

这是我的脚本,里面有一些 cmets。我真的很感谢你们能提供的任何帮助。强制“不是特别精通 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);
}

【问题讨论】:

    标签: javascript google-apps-script


    【解决方案1】:

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

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

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

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

    您的最终代码将如下所示:

    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;
              }
     }
    

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

    【讨论】:

    • 这绝对适用于空白日期;谢谢!关于如何解决“糟糕的日期”的任何想法?我查看了您发送的页面并怀疑“中断”而不是“继续”可能是正确的(可能是“Browser.msgBox('Bad Date Detected')&& Break;”),但显然搜索“无效日期”会发现既空白又无效;这会是对“if”语句的更改还是应该嵌套一个“if”,如果是这样,那将是一个只会变得无效而不是空白的测试?
    • @Databoy2k 请看看我的编辑。如果您希望代码在遇到错误日期时停止,只需修改 else 语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多