Google表格的脚本-添加到日历时,跳过日期格式不正确的行

时间:2018-10-23 18:41:50

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

我需要有关此脚本的帮助,该脚本用于将工作表中的数据添加到Google日历。我承认,我在网上找到了它,并对其进行了编辑以适合我的工作表。它将完美地工作,唯一的问题是工作表是从在JotForm中输入的数据填充的,我们在工作中使用这些数据的人需要将需要支持的即将发生的事件通知我们的人。
话虽这么说,并不是每个人都足够谨慎以确保其事件结束时间在其事件开始时间之后。由于时间不正确,这会导致代码中断并且无法执行(如果结束时间早于开始时间,则无法向Google日历添加事件。

这是我到目前为止的代码:

function createCalendarEvent() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var calendar = CalendarApp.getCalendarById('CalendarIDHere');

  var startRow = 2;  // First row of data to process - 2 exempts my header row
  var numRows = sheet.getLastRow();   // Number of rows to process
  var numColumns = sheet.getLastColumn();

  var dataRange = sheet.getRange(startRow, 1, numRows-1, numColumns); 
  var data = dataRange.getValues();

  var complete = "Done";

  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var name = row[1];             //Event Name
    var sDate = new Date(row[2]);  //Start date/time
    var eDate = new Date(row[3]);  //End date/time
    var attendees = row[4];        //Number of Guests 
    var location = row[5];         //Event Location
    var organizer = row[6];        //Event Organizer
    var contact = row[7];          //Organizer e-mail
    var department = row[8];       //Department
    var setup = row[9];            //Room Set-up Needed
    var config = row[10];          //Room Configuration Requested
    var rSetup = row[11];          //Details about Room Set-up
    var food = row[12];            //Food Services Needed
    var additional = row[13];      //Additional Info
    var eventID = row[14];         //event marked Done

    if (eventID != complete) {
      var currentCell = sheet.getRange(startRow + i, numColumns);
      calendar.createEvent(name, sDate, eDate,
      { 
        description: 'Department: ' + department + '\r' + 'Organizer: ' + organizer + '\r' + 'Organizer E-mail: ' + contact + '\r' + '\r' + 'Attendees: ' + attendees + '\r' + 'Room Configuration Type: ' + config + '\r' + '\r' + 'Room Set Up, Security, Cleaning details: ' + '\r' + rSetup + '\r' + '\r' + 'Food Services?: ' + food + '\r' + '\r' + 'Additional Information: ' + additional
      });

      currentCell.setValue(complete);
    }
  }
}

我可以添加什么来使脚本检查数据并跳过sDate单元格中日期/时间之前在eDate单元格中具有日期/时间的行?

1 个答案:

答案 0 :(得分:0)

发问者问题的实质是“不是每个人都足够谨慎以确保其事件结束时间在其事件开始时间之后。这会导致代码由于错误的时间而中断并且无法执行(您无法添加如果您的结束时间早于开始时间,则会向Google日历发送事件。”

从表面上看,这不是关于Google表格的问题,而是关于Jotform中的条件逻辑的问题。幸运的是,JotForm可以管理这一点。 Conditions-for-start-and-end-dates确切地解释了如何编辑JotForm以确保开始日期和结束日期同步。但是,发问者可能无法编辑JotForm,因此在此之前,我们将专注于Google表格逻辑中的响应数据。

下面的代码是在循环开始之后和初始化其余事件变量之前插入的摘录。这样,代码就可以评估开始日期和结束日期,并在开始日期早于结束日期时进行处理。

我添加了三个if语句和一个变量mismatch
mismatch在每个新事件行的开头初始化,其值为零。如果日期比较突出了一个问题,则该变量的值为1。这使代码可以测试开始日期和结束日期中的各种错误。毕竟,如果不匹配的值不为1,则处理可以“照常”继续进行,否则,代码可以循环到下一个事件。
if #1-测试开始日期是否大于结束日期;如果是,则发出警告,设置一个新的背景,并将不匹配的值设置为1(一个)。
if #2-测试开始日期是否等于结束日期;如果是,则发出警告,设置一个新的背景,并将不匹配的值设置为1(一个)。
if #3-测试不匹配的值是否为1;如果否,则继续处理;如果是,请循环返回下一个事件。


  for (var i = 0; i < data.length; ++i) {
    var mismatch = 0;
    var row = data[i];
    var sDate = new Date(row[2]);  //Start date/time
    var eDate = new Date(row[3]);  //End date/time
    Logger.log("Start = "+sDate+", end = "+eDate);
    if ((sDate - eDate) >0){
      // "start date is later than end data");
      SpreadsheetApp.getUi().alert("AUDIT WARNING: Start date > end date. Script will NOT stop but this request marked in Red. ");
      sheet.getRange(i+2,1,1,6).setBackground("red");
      mismatch = 1;
    }
    if ((sDate - eDate) == 0){
      // start date and end date are the same");
      SpreadsheetApp.getUi().alert("AUDIT WARNING: Start date and end date are the same. Script will NOT stop but this request marked in Orange. ");
      sheet.getRange(i+2,1,1,6).setBackground("darkorange");
      mismatch = 1;
    }
    if (mismatch != 1){
      //by definition, start date is less than end date. 
      // insert code to process

    }

  }

此屏幕截图显示了处理的效果

enter image description here