【问题标题】:Calendar Events to Sheet is Duplicating - remove duplicates not working工作表的日历事件正在重复 - 删除重复项不起作用
【发布时间】:2020-09-23 14:56:32
【问题描述】:

请参阅下面的代码:它设置为在日历事件上更新。 但是事件仍在复制到工作表上。 你能看看我哪里出错了吗?

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

   } 

   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);
  }
}
}

【问题讨论】:

  • 我认为您正在使用非常复杂的代码来完成一项非常简单的任务。你能澄清一下你想完成什么吗?您想附加新创建的事件,这些事件仍然不在工作表中(当然,忽略已经存在的事件)?您能否提供一份您正在处理的电子表格的副本,不含敏感信息?
  • @lamblichus 我是脚本的菜鸟,这是一个非常重要的项目。代码对我来说似乎也很复杂。我只想将从日历添加的新事件放入工作表中。这是一个副本 [链接] (docs.google.com/spreadsheets/d/…)
  • 我还是不明白你的困境。因此,您正在从日历中检索一些事件(某些日期之间的事件)。你想把这些事件写到你的工作表上。但问题来了:duplicates 是什么意思?之前复制到工作表中的事件,因此您不想再次复制它们?
  • row.slice(0,2).join() == eventArray[j].slice(0,2).join() 查找这些重复项的目的是什么? roweventArray 都来自 eventDetails,所以我不明白你为什么要比较它(你没有检查以前添加到工作表中的事件)。为什么slice(0,2)?您是否只需要检查locationtitle 即可查看哪些是重复的?我觉得您的问题很容易解决,但首先有必要了解您到底想要完成什么。
  • 我想将事件从日历写入工作表。将新事件添加到日历时,我希望工作表仅将新事件写入工作表,而不是将所有事件重新写入工作表。我试过了,它也不起作用: var row = eventDetails[i] var duplicate = false; for(j in eventArray){ if (row == eventArray[j]){ duplicate = true; } } if (!duplicate){ eventArray.push(row);}

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


【解决方案1】:

问题:

  • 您有一张包含日历事件列表数据的工作表。
  • 您需要一个脚本来检索和写入任何新事件,而忽略工作表中已有的事件。
  • 您通过其locationtitledescription 识别事件。

解决办法:

如果这一切都正确,那么您可以执行以下操作:

  • 从日历中检索事件后,使用map() 检索事件详细信息。
  • 如果工作表中有任何旧事件,请将它们从您的eventDetails 数组中过滤出来,使用filter()every()slice() 的第二个参数是排他性的,如果您想比较这三个第一个属性,应该是slice(0,3) 而不是slice(0,2))。
  • 如果过滤后的 eventDetails 数组不为空(即日历中有新事件),请将这些新事件写入您的工作表。

代码示例:

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);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-18
    • 2019-09-13
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多