Google Script - Остановить повторяющиеся события календаря - PullRequest
2 голосов
/ 10 января 2020

В настоящее время я внедряю систему доставки, первым шагом которой является получение листа Google, интегрируемого с календарем Google.

Мне удалось заставить это работать, но проблема в том, что я не могу найти способ заставить календарь проверить, существует ли уже идентификационный номер (в электронной таблице как DO #), чтобы не создавать другое событие за это. Причина, по которой у меня будет несколько строк с одним и тем же идентификационным номером, заключается в том, что мне требуется отдельная строка для каждого доставляемого товара, даже если это одно и то же задание, чтобы иметь возможность загрузить его на сторону доставки вещей. У меня было настроено не создавать несколько событий, если столбец eventID был заполнен, но, похоже, это тоже не работает правильно. Любая помощь приветствуется!

Код в настоящее время выглядит следующим образом:

function createCalendarEvent(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var calendar =CalendarApp.getCalendarById('e3pbfcblhsmehusmotijp1r9e8@group.calendar.google.com');

  var startRow =2; //2 exempts header row check if applicable
  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 DONumber = row[1]; //D.O#
    var Address = row[2];  //AddressDe
    var contact = row[3]; //Deliver to Contact
    var phone = row[4];  //Contact Phone Number
    var time = row[5]; //Delivery time
    var instructions = row[6]; //Instructions
    var assign = row[7]; //Which truck to assign to
    var notify = row[8]; //email to notify when delivery is complete
    var goods = row[9]; //Description of goods
    var quantity = row[10]; //Quantiy of each item
    var date = new Date(row[11]);  //Delivery date
    var edate = new Date(row[12]); //end date
    var eventID = row[13]; //stops duplication

if (eventID != complete) {
  var currentCell = sheet.getRange(startRow +i, numColumns);
  calendar.createEvent(contact,date,edate,{
    description: contact + '\r' + phone + '\r' + instructions + '\r' + goods + '\r' + quantity  
  });

  currentCell.setValue(complete);
}
  }

Образец электронной таблицы

1 Ответ

1 голос
/ 10 января 2020

Если я вас правильно понимаю:

  • У вас есть несколько строк данных и вы хотите создать событие календаря для каждой строки.
  • Вы хотите избежать создания событий для строк, чьи D.O# соответствует событию, которое уже было создано.

Если это так, то вы можете использовать массив для отслеживания всех D.O#, которые создали свои события. Идея состоит в том, чтобы добавить D.O# к массиву через pu sh и для каждой итерации проверять, находится ли текущий D.O# в массиве (используя indexOf ).

Это может быть что-то в следующих строках (см. Встроенные комментарии, чтобы получить подробную информацию о том, что код делает в критических строках):

function createCalendarEvent() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var calendar = CalendarApp.getCalendarById('e3pbfcblhsmehusmotijp1r9e8@group.calendar.google.com');
  var startRow = 2;
  var numRows = sheet.getLastRow();
  var numColumns = sheet.getLastColumn();
  var dataRange = sheet.getRange(startRow, 1, numRows - 1, numColumns);
  var data = dataRange.getValues();
  var complete = "Done";
  var sentIDs = []; // Array to track D.O that have been sent
  for (var i=0; i < data.length; ++i) {
    var row = data[i];
    var DONumber = row[1];   
    var eventID = row[13];
    if (eventID == complete) { // If event was created in a previous script execution, 
      sentIDs.push(DONumber);  // add D.O. to array to avoid same D.O. being sent
    }
    if (sentIDs.indexOf(DONumber) == -1) {
      sentIDs.push(DONumber); // Add to array to avoid same D.O. being sent
      var Address = row[2];
      var contact = row[3]; 
      var phone = row[4];
      var time = row[5];
      var instructions = row[6];
      var assign = row[7];
      var notify = row[8];
      var goods = row[9];
      var quantity = row[10];
      var date = new Date(row[11]);
      var edate = new Date(row[12]);
      var currentCell = sheet.getRange(startRow + i, numColumns);
      calendar.createEvent(contact, date, edate, {
        description: contact + '\r' + phone + '\r' + instructions + '\r' + goods + '\r' + quantity  
      });    
      currentCell.setValue(complete);      
    }
  }
}

Одна вещь, которую нужно выделить, заключается в том, что eventID используется для добавления соответствующего D.O. в массив sentIDs, чтобы избежать создания событий, которые совместно используют тот же D.O. с событием, которое было создано при предыдущем выполнении кода (см. Встроенные комментарии).

Примечание. В предоставленном образце отсутствуют открывающие скобки для for l oop. Это может привести к тому, что ваш код не будет работать должным образом. Я исправил это в приведенном здесь примере.

Надеюсь, это поможет.

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