gpt4 book ai didi

google-apps-script - 根据 2 列条件删除重复行的 Google 脚本

转载 作者:行者123 更新时间:2023-12-04 05:05:43 30 4
gpt4 key购买 nike

我正在使用一个脚本,它从日历中提取事件详细信息并将它们添加到电子表格的 A 列和 B 列中,删除任何重复的事件,然后根据日期进行排序。我希望我可以让员工在 C、D 等列中添加有关这些事件的其他数据。

这似乎工作正常,但是一旦在 C、D 列中添加信息,脚本重复数据删除功能就会停止工作,因为它正在比较整行,而不仅仅是正在导入的内容。

是否有一种方法可以调整以下重复数据删除脚本,以便在决定行是否重复并应删除时仅检查 A 列和 B 列?

我尝试使用以下代码(当前已注释掉)调整,如本文变体部分所示:https://developers.google.com/apps-script/articles/removing_duplicates - 但它似乎仍然不起作用。

感谢您的任何帮助

脚本:

enter code here

//this section retrieves the information from a calendar from a user submitted date until the end of the year

function importEvents(){
var calID = Browser.inputBox("Please enter your google Cal ID", Browser.Buttons.OK_CANCEL);
var startdate = Browser.inputBox("Start date using 1/1/2013 format", Browser.Buttons.OK_CANCEL);
var cal = CalendarApp.getCalendarById(calID);
var events_sheet = SpreadsheetApp.getActiveSheet();
var events = cal.getEvents(new Date(startdate), new Date("1/1/2014"));
var lr = events_sheet.getLastRow();
var eventarray = new Array();

var i = 0; // edited
for (i = 0; i < events.length; i++) {
line = new Array();
line.push(events[i].getStartTime());
line.push(events[i].getTitle());

//Potential more data that I am not getting at this time
// line.push(events[i].getDescription());
// line.push(events[i].getEndTime());

eventarray.push(line);
}

events_sheet.getRange("A"+(lr+1)+":B"+(lr+i)).setValues(eventarray);

//sort ascending dy date

var range = SpreadsheetApp.getActiveSheet().getRange("A3:F2000");
range.sort([{column: 1, ascending: true}]);

//removes duplicate rows

var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var newData = new Array();
for(i in data){
var row = data[i];
var duplicate = false;
for(j in newData){

if(row.join() == newData[j].join()){
duplicate = true;

//This was supposed to only check the first 2 columns, but it doesn't work
//I found this code in the variation section of this tutorial: https://developers.google.com/apps-script/articles/removing_duplicates
//
// if(row[0] == newData[j][0] && row[1] == newData[j][1]){
// duplicate = true;

}
}
if(!duplicate){
newData.push(row);
}
}
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);

}

最佳答案

通过一些调整,可以使注释掉的块起作用。由于数据的性质以及本教程没有考虑对象比较的工作方式,因此会出现问题。 (引用 JavaScript Date Object Comparison。)

您的第一列包含 Date对象,其中 ==比较器将评估 true只有当比较的双方都是同一个对象时。在整行比较中,日期被 .join() 强制转换为字符串。操作。我们可以逐个单元地获得相同的效果,如下所示:

 if(row[0].toString() == newData[j][0].toString() && row[1] == newData[j][1]){
duplicate = true;
}

或者,我们可以使用 Array.slice() 将比较限制为前两列。操作。这样,我们就不需要知道比较的是什么类型,因为我们仍然会使用 .join()形成一个字符串进行比较:
if(row.slice(0,2).join() == newData[j].slice(0,2).join()){
duplicate = true;
}

排序

您会遇到的另一个问题是 range.sort() 的位置.在删除重复项之前进行排序是危险的,因为您无法保证新检索的事件数据与您已经拥有的可能具有附加信息列的同一事件的数据的顺序。因此,重复删除可能会删除您用户输入的信息。将排序作为最后一步更安全,或者在排序中包含额外的列以保证顺序。

另一个小问题: .getRange("A3:F2000")的使用具有将电子表格扩展到 2000 行的副作用;你可以改用 .getRange("A3:F") ,这将检索最大范围而不扩展它。

但我建议您完全使用 javascript 数组进行排序,这比使用电子表格服务要快得多。我假设您有两行标题信息要保留在工作表的顶部,因为您是从 A3 排序的。 .这是一种进行排序的方法:
// sort ascending by date - retain header lines
var headers = newData.slice(0,2);
var sorted = newData.slice(2).sort(sortFunction);
var newData = headers.concat(sorted);

哪里 sortFunction()是:
function sortFunction( a, b ) {
// coerce dates to numbers and return comparison
return ((+a[0]) - (+b[0]))
}

最终剧本

这是你得到的,上面的变化。
function importEvents(){
var calID = Browser.inputBox("Please enter your google Cal ID", Browser.Buttons.OK_CANCEL);
var startdate = Browser.inputBox("Start date using 1/1/2013 format", Browser.Buttons.OK_CANCEL);
var cal = CalendarApp.getCalendarById(calID);
var events_sheet = SpreadsheetApp.getActiveSheet();
var events = cal.getEvents(new Date(startdate), new Date("1/1/2014"));
var lr = events_sheet.getLastRow();
var eventarray = new Array();

var i = 0; // edited
for (i = 0; i < events.length; i++) {
line = new Array();
line.push(events[i].getStartTime());
line.push(events[i].getTitle());

//Potential more data that I am not getting at this time
// line.push(events[i].getDescription());
// line.push(events[i].getEndTime());

eventarray.push(line);
}

// Append the retreived events to existing spreadsheet
events_sheet.getRange("A"+(lr+1)+":B"+(lr+i)).setValues(eventarray);

//remove duplicate rows
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var newData = new Array();
for(i in data){
var row = data[i];
var duplicate = false;
for(j in newData){

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

// sortFunction used to compare rows of data in our newData array
function sortFunction( a, b ) {
// coerce dates to numbers and return comparison
return ((+a[0]) - (+b[0]))
}

// sort ascending by date - retain header lines
var headers = newData.slice(0,2);
var sorted = newData.slice(2).sort(sortFunction);
var newData = headers.concat(sorted);

// Clear the existing info and update with newData.
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

关于google-apps-script - 根据 2 列条件删除重复行的 Google 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15524772/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com