Google apps script 工作表的日历事件正在复制-删除不起作用的重复项
请参阅下面的代码:它设置为在日历事件时更新。 但事件仍在重复。 你能看看我哪里出错了吗 仅获取新创建的事件-是否有方法按创建日期获取事件(现在)Google apps script 工作表的日历事件正在复制-删除不起作用的重复项,google-apps-script,google-sheets,duplicates,google-calendar-api,google-sheets-api,Google Apps Script,Google Sheets,Duplicates,Google Calendar Api,Google Sheets Api,请参阅下面的代码:它设置为在日历事件时更新。 但事件仍在重复。 你能看看我哪里出错了吗 仅获取新创建的事件-是否有方法按创建日期获取事件(现在) } var events=calendar.getEvents(开始、结束); var eventDetails=[]; var eventarray=新数组(); 对于(var i=0;假设: 您有一个包含日历事件列表中数据的工作表 您需要一个脚本来检索和写入任何新事件,而忽略工作表中已经存在的事件 您可以通过事件的位置、标题和描述来识别事件 解
}
var events=calendar.getEvents(开始、结束);
var eventDetails=[];
var eventarray=新数组();
对于(var i=0;假设:
- 您有一个包含日历事件列表中数据的工作表
- 您需要一个脚本来检索和写入任何新事件,而忽略工作表中已经存在的事件
- 您可以通过事件的
位置
、标题
和描述
来识别事件
解决方案:
如果所有这些都正确,则可以执行以下操作:
- 从日历中检索事件后,使用可检索事件详细信息
- 如果工作表中有任何旧事件,请使用and(的第二个参数是独占的,因此,如果要比较前三个属性,它应该是
slice(0,3)
,而不是slice(0,2)
),将它们从eventDetails
数组中筛选出来
- 如果过滤后的
eventDetails
数组不为空(即日历中有新事件),请将这些新事件写入工作表
代码示例:
我认为您正在使用一个非常复杂的代码来完成一项非常简单的任务。您能澄清一下您想要完成什么吗?您想要附加新创建的事件,这些事件仍然不在工作表中(当然,忽略已经存在的事件)?你能提供一份你正在处理的电子表格的副本,没有敏感信息吗?@lamblichus我是脚本的高手,这是一个非常重要的项目。代码对我来说也很复杂。我只想把从日历中添加的新事件放在工作表中。这是一份副本[链接]()我还是不明白你的处境。所以,你正在从日历中检索一些事件(某些日期之间的事件)。您想将这些事件写入工作表。但问题来了:重复的是什么意思?以前复制到工作表中的事件,因此您不想再次复制它们吗?行.slice(0,2).join()的目的是什么
在查找这些重复项时?行
和事件数组
都来自eventDetails
,因此我不明白您为什么要进行比较(您没有检查以前添加到工作表中的事件)。以及为什么切片(0,2)
?您是否只需要检查位置
和标题
,就可以看到哪些是重复的?我觉得您的问题很容易解决,但首先需要了解您到底想要完成什么。我想将事件从日历中写入工作表。当新事件添加到日历中时ndar,我希望工作表只将新事件写入工作表,而不是将所有事件重新写入工作表。我尝试了此操作,但它也不起作用:var row=eventDetails[I]var duplicate=false;for(j in eventArray){if(row==eventArray[j]){duplicate=true;}if(复制!){EvialStudi.Press(行)} @ LAMBICHUS您是一个救生员!!!谢谢您!
}
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);
}
}
}
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);
}
}