Sheet 的日历活动正在重复 - 删除重复行不通

Calendar Events to Sheet is Duplicating - remove duplicates not working

查看下面的代码:设置为在日历事件上更新。 但是事件仍在复制到 sheet。 你能看看我哪里错了吗?

只获取新创建的事件 - 有没有办法按创建日期(现在)获取事件?

   } 

   var events = calendar.getEvents(start, end); 
   var eventDetails = []; 


  var eventarray = new Array();
for(var i = 0; i<events.length; i++){ 
    eventDetails.push([events[i].getLocation(), events[i].getTitle(), events[i].getDescription(), events[i].getStartTime()]); 
 
    }
    var startRow =  sheet.getLastRow();
    var startCol = 2; 
    for(var j = 0; j<eventDetails.length; j++){ 
    var tempRange = sheet.getRange(startRow+j,startCol, 1, 4); 
    var eventArray = new Array(eventDetails[j]); 
    tempRange.setValues(eventArray); 
  } 
  //Here lies the problem code//
   for(i in eventDetails){
    var row = eventDetails[i];
    var duplicate = false;
    for(j in eventArray){

      if(row.slice(0,2).join() == eventArray[j].slice(0,2).join()){
        duplicate = true;
      }
    }
    }
    if(!duplicate){
      eventArray.push(row);
      {
  return eventArray;
    ss.sort(2, true);
  }
}
}

问题:

  • 您有一个 sheet 数据来自日历事件列表。
  • 您希望脚本检索和写入任何新事件,忽略 sheet 中已有的事件。
  • 您通过 locationtitledescription 来识别事件。

解决方案:

如果所有这些都是正确的,那么您可以执行以下操作:

  • 从日历中检索事件后,使用 map() 检索事件详细信息。
  • 如果 sheet 中有任何旧事件,请将它们从 eventDetails 数组中过滤掉,使用 filter() and every() (the second parameter of slice() 是唯一的,所以,如果您想比较前三个属性, 它应该是 slice(0,3) 而不是 slice(0,2)).
  • 如果eventDetails的过滤数组不为空(即日历中有新事件),将这些新事件写入您的sheet。

代码示例:

function importCalendar(){ 
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); //Target sheet for events
  var calendarName = sheet.getRange('C2').getValue(); //name of calendar ex. calendar@gmailcom
  var start = sheet.getRange('C3').getValue(); //to date
  var end = sheet.getRange('C4').getValue();  //from date  
  var calendar = CalendarApp.getCalendarById(calendarName);
  if(!calendar) calendar = CalendarApp.getCalendarsByName(calendarName)[0];  
  var events = calendar.getEvents(start, end);
  var eventDetails = events.map(event => [event.getLocation(), event.getTitle(), event.getDescription(), event.getStartTime()]);
  var lastRow =  sheet.getLastRow();
  var startCol = 2; // Column where the event list starts
  var oldStartRow = 8; // Row where the event list starts
  var numCols = 4; // Number of event fields
  var numRows = lastRow - oldStartRow + 1;
  if (numRows !== 0) { // If there are events in the sheet, filter the duplicates
    var oldEvents = sheet.getRange(oldStartRow, startCol, lastRow - oldStartRow + 1, numCols).getValues();
    // Filter out duplicates:
    eventDetails = eventDetails.filter(eventRow => oldEvents.every(oldEvent => oldEvent.slice(0,3).join() != eventRow.slice(0,3).join()));    
  }
  if (eventDetails.length != 0) { // Check if there is any new event coming from the Calendar
    sheet.getRange(lastRow + 1, startCol, eventDetails.length, eventDetails[0].length).setValues(eventDetails);
  }
}