我编写了一个非常简单的脚本,该脚本成功地从Google Spreadsheet中的一张工作表中获取信息,并替换了同一电子表格中另一张工作表中的列,直到满足两个条件:接收行具有相同的“客户ID”和“产品类型”。我说“简单”是因为它很直观,但是对计算的要求很高(要花近30秒钟才能运行!)。
从我在线阅读的内容来看,导致速度变慢的是顺序读取和写入操作。我假设,如果我根据两个条件对有问题的工作表进行排序,然后执行在后续行中写入的函数,则可以加快速度。我在算法上有些虚弱,所以我仍然在努力地优雅地做些事情。
有人有什么建议吗?下面是我的原始脚本,并且我已经确保电子表格可以折叠为空行,因此不会浪费时间重复任何事情。
function replaceRawWithRepChanges(receivedSheet) {
var ss = SpreadsheetApp.openById(receivedSheet);
var repchanges = ss.getSheetByName('repchanges');
var rawSheet = ss.getSheetByName('Sheet1');
var rawTMtoReplace = rawSheet.getRange('P2:P');
var repCustID = repchanges.getRange('A1:A').getValues();
var repTM = repchanges.getRange('F1:F').getValues();
var repCategory = repchanges.getRange('G1:G').getValues();
var rawCustID = rawSheet.getRange('A2:A').getValues();
var rawTM = rawSheet.getRange('P2:P').getValues();
var rawCategory = rawSheet.getRange('U2:U').getValues();
var repInfo = [repCustID, repTM, repCategory];
var rawInfo = [rawCustID, rawTM, rawCategory];
for (var i=0; i < rawInfo[0].length; i++) {
for (var j=0; j < repInfo[0].length; j++) {
// var thisRawCust = rawInfo[0][i];
// var thisRepCust = repInfo[0][j];
if (rawInfo[0][i].toString() == repInfo[0][j].toString()) {
// var thisRawCategory = rawInfo[2][i];
// var thisRepCategory = repInfo[2][j];
if (rawInfo[2][i].toString() == repInfo[2][j].toString()) {
// var repvalue = repInfo[1][j];
rawInfo[1][i] = repInfo[1][j];
// var newRawValue = rawInfo[1][i];
}
}
}
}
return rawInfo[1];
}
答案 0 :(得分:2)
是的,您应该对数据进行排序(也许使用SORT
命令,该命令适用于多列)。然后,使用两个指针,您只需向下浏览一次列,而无需检查整个repInfo
的{{1}}中每一行的匹配情况。
对信息进行排序后,循环可能如下所示:
rawInfo