我有一张包含10k +行数据的Google表格。虽然它应该很少见,但是可能会有重复数据输入到选项卡中,我编写了一个脚本来搜索和删除这些重复项。有一段时间,这个脚本运行良好,完全符合我的预期。但是现在该选项卡已经增长到超过1万行,脚本超过了6分钟的时间限制。
我已将此功能基于this tutorial。
m_dir = New [String](m_dir.Where(Function(c) (Asc(c) >= 32) AndAlso (Asc(c) <= 175)).ToArray())
我想过将它分解成碎片;处理3个不同呼叫中每个呼叫的1/3数据。但这实际上是从一个不同的函数调用的,该函数通过电子邮件发送返回的deleteCount值,如果它大于0。
// remove duplicates on Ship Details Complete
function duplicateShipDetailsComplete() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName("Shipment Details Complete");
var sourceRange = sourceSheet.getRange(2, 1, sourceSheet.getLastRow(), 16)
var sourceData = sourceRange.getValues();
var keepData = new Array();
var deleteCount = 0;
for(i in sourceData) { // look for duplicates
var row = sourceData[i];
var duplicate = false; // initialize as not a duplicate
for(j in keepData) { // compare the current row in data to the rows in newData
if(row[2] == keepData[j][2] // duplicate Partner Invoice?
&& row[4] == keepData[j][4] // duplicate vPO?
&& row[5] == keepData[j][5] // duplicate SKU?
&& row[7] == keepData[j][7]) { // duplicate qty?
duplicate = true; // only if ALL criteria are duplicate, set row as a duplicate
}
}
if(!duplicate) { // If the row is NOT a duplicate
keepData.push(row); // add to newData
} else {
deleteCount++; // keep track of duplicates being deleted
}
}
sourceRange.clear();
sourceSheet.getRange(2, 1, keepData.length, keepData[0].length).setValues(keepData); // paste the keepData into the Working sheet
return deleteCount;
}
即使没有该电子邮件功能,当我直接调用duplicateShipDetailsComplete()时,它已超出限制。我想我可以编写三个不同的函数(第一个1/3,第二个1/3,第三个1/3)并在某个地方用每个结果更新一个单元格,然后分别调用电子邮件函数来获取该值。如果我可以编写1个函数并将参数传递给它,我会觉得好一点,但这都来自基于时间的触发器,你不能从那些传递parms。但在我开始这样做之前,我想我会检查是否有人就如何使现有代码更有效率提出其他建议。或者,看看是否有人对我如何做到完全不同。
由于