Остановите скрипт Google от дублирования событий, перенесенных с листов в календарь

#javascript #google-apps-script #google-sheets #duplicates #google-calendar-api

Вопрос:

Я искал ТАК, и эта тема поднималась раньше, но я еще не нашел ничего, что работает для меня. У меня есть документ Google sheets, в котором я отслеживаю события и даты начала этих событий. Я настроил какой-то скрипт для переноса любых событий, которые я создаю в документе «Листы», в календарь. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда запускается этот сценарий, он добавляет все, что есть на листе. Это проблема, потому что он создает дубликаты каждый раз, когда запускается. Есть ли способ настроить это так, чтобы мой скрипт добавлял только новые события, которых еще нет в моем календаре.

Вот мой код:

 function createCalendarEvent(){
  var ctCalendar = CalendarApp.getCalendarById('v6utsrj3up5givjadrd1ce83qs@group.calendar.google.com');
  var sheet = SpreadsheetApp.getActiveSheet();
  var event = sheet.getDataRange().getValues();
  var startRow = 2;
  var numColumns = sheet.getLastColumn();
  var complete ="Added";
  var showCheck = [];
  event.splice(0,1);

for(x=0; x<event.length;x  ){
  var showNumber = [9];
  if(stopDuplicate == complete){
    showCheck.push(showNumber);
  }
  var newEvent = event[x];
  var eventName = newEvent[10];
  var eventStart = newEvent[11];
  var stopDuplicate = newEvent[14]

if(showCheck.indexOf(showNumber == 0)) 
{
  showCheck.push(showNumber);
  var currentCell = sheet.getRange(startRow   x, numColumns );
  ctCalendar.createAllDayEvent(eventName, eventStart);
  currentCell.setValue(complete); 
 }
}

}
 

Это Лист С моими событиями

Комментарии:

1. Возможно, вы захотите проверить, существует ли уже такое же событие, или добавить столбец на листе в качестве флага, показывающего, было ли оно уже создано.

Ответ №1:

 function createCalendarEvent() {
  const cal = CalendarApp.getCalendarById('v6utsrj3up5givjadrd1ce83qs@group.calendar.google.com');
  const sh = SpreadsheetApp.getActiveSheet();
  const numColumns = sh.getLastColumn();
  const evs = sh.getRange(sr, 1, sh.getLastRow() - sr   1, numColumns).getValues();
  const sr = 2;
  evs.forEach((r,i) => {
    if(r[14] != "Done") {
      cal.createAllDayEvent(r[10],r[11]);
      sh.getRange(i   sr, 15).setValue("Done");
    }
  });
}
 

Комментарии:

1. Это было именно то, что я искал. Похоже, я, возможно, слишком все усложнил? Определенно, код намного чище. Спасибо!