Google apps script 基于2列条件删除重复行的Google脚本
我在中使用的脚本从日历中提取事件详细信息,并将它们添加到电子表格的a列和B列中,删除任何重复的事件,然后根据日期排序。我希望我能让员工在C、D等栏中添加关于这些事件的额外数据 这似乎工作正常,但一旦在C、D列中添加了信息,脚本重复数据消除功能就会停止工作,因为它将比较整行,而不仅仅是要导入的内容 是否有一种方法可以调整下面的重复数据消除脚本,以便在决定行是否重复并应删除时仅检查列a和B 我尝试使用下面的代码(目前已注释掉)调整,如本文的变体部分所示:-但它似乎仍然不起作用 谢谢你的帮助 剧本:Google apps script 基于2列条件删除重复行的Google脚本,google-apps-script,google-sheets,deduplication,Google Apps Script,Google Sheets,Deduplication,我在中使用的脚本从日历中提取事件详细信息,并将它们添加到电子表格的a列和B列中,删除任何重复的事件,然后根据日期排序。我希望我能让员工在C、D等栏中添加关于这些事件的额外数据 这似乎工作正常,但一旦在C、D列中添加了信息,脚本重复数据消除功能就会停止工作,因为它将比较整行,而不仅仅是要导入的内容 是否有一种方法可以调整下面的重复数据消除脚本,以便在决定行是否重复并应删除时仅检查列a和B 我尝试使用下面的代码(目前已注释掉)调整,如本文的变体部分所示:-但它似乎仍然不起作用 谢谢你的帮助 剧本:
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);
}
在此处输入代码
//本节从日历中检索从用户提交日期到年底的信息
函数importEvents(){
var calID=Browser.inputBox(“请输入您的google Cal ID”,Browser.Buttons.OK\u CANCEL);
var startdate=Browser.inputBox(“使用2013年1月1日格式的开始日期”,Browser.Buttons.OK\u CANCEL);
var cal=CalendarApp.getCalendarById(calID);
var events_sheet=SpreadsheetApp.getActiveSheet();
var事件=cal.getEvents(新日期(startdate)、新日期(2014年1月1日));
var lr=events_sheet.getLastRow();
var eventarray=新数组();
var i=0;//已编辑
对于(i=0;i
通过一些调整,可以使注释掉的块工作。出现问题的原因是数据的性质,以及本教程没有考虑对象比较的工作方式。(请参阅。)
第一列由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);
}
函数导入事件(){
var calID=Browser.inputBox(“请输入您的google Cal ID”,Browser.Buttons.OK\u CANCEL);
var startdate=Browser.inputBox(“使用2013年1月1日格式的开始日期”,Browser.Buttons.OK\u CANCEL);
var cal=CalendarApp.getCalendarById(calID);
var events_sheet=SpreadsheetApp.getActiveSheet();
var事件=cal.getEvents(新日期(startdate)、新日期(2014年1月1日));
var lr=events_sheet.getLastRow();
var eventarray=新数组();
var i=0;//已编辑
对于(i=0;i// This example sorts on first column of data array
data.sort(function(x,y){
var xp = x[0];
var yp = y[0];
//Logger.log(xp+' '+yp);// just to check that it takes the right column
return xp == yp ? 0 : xp < yp ? -1 : 1;// first sort ascending
});
var newData = new Array();
for(var i in data){
var duplicate = false;
for(var j in newData){
if(data[i][0].toString()+data[i].toString() == newData[j][0].toString()+newData[j][1].toString()){ duplicate = true }
}
if(!duplicate){ newData.push(data[i]) }
}