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 中已有的事件。
- 您通过
location
、title
和 description
来识别事件。
解决方案:
如果所有这些都是正确的,那么您可以执行以下操作:
- 从日历中检索事件后,使用 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);
}
}
查看下面的代码:设置为在日历事件上更新。 但是事件仍在复制到 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 中已有的事件。
- 您通过
location
、title
和description
来识别事件。
解决方案:
如果所有这些都是正确的,那么您可以执行以下操作:
- 从日历中检索事件后,使用 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);
}
}