Google Script for Sheets - при добавлении в календарь пропускайте строки с неправильными форматами даты - PullRequest
0 голосов
/ 23 октября 2018

Мне нужна помощь с этим сценарием, который я использую для добавления данных из листа в календарь 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);
    }
  }
}

Что можно добавить к этому, чтобы скрипт проверял данные и пропускал все строки с датой / временем в ячейке eDate до даты / времени в ячейке sDate?

1 Ответ

0 голосов
/ 05 ноября 2018

Суть проблемы спрашивающего заключается в том, что «не все достаточно осторожны, чтобы убедиться, что время окончания их события наступает после времени начала их события. Это приводит к тому, что код прерывается и не выполняется из-за неправильного времени (вы не можете добавитьсобытие в Календаре Google, если ваше Время окончания предшествует времени начала. "

На первый взгляд, это не проблема Google Sheets, а скорее условная логика в Jotform. К счастью, JotForm может справиться с этим. Условия для дат начала и окончания объясняет, как именно редактировать JotForm, чтобы обеспечить синхронизацию даты начала и окончания, однако, возможно, что спрашивающий не имеет возможности редактироватьJotForm, так что до тех пор мы сосредоточимся на ответных данных, поступающих в логике Google Sheets.

Приведенный ниже код является выдержкой, вставляемой после начала цикла и до инициализации остальных переменных события. Это позволяеткод для оценки даты начала и окончания и продолжения обработки ONLY если дата начала раньше даты окончания.

Я добавил три 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...