Algorithm 加快查找和替换工作表的Google Apps脚本功能
我已经编写了一个非常简单的脚本,它成功地从Google电子表格中的一个工作表中获取信息,并在满足两个条件之前替换同一电子表格中另一个工作表中的列中的信息:接收行具有相同的“客户ID”和“产品类型”。我之所以说“简单”,是因为它直观,但计算量非常高(运行需要近30秒!) 从我在网上读到的内容来看,是顺序读写操作导致了经济放缓。我假设,如果我根据这两个标准对有问题的工作表进行排序,然后执行一个覆盖后续行的函数,我可能能够加快速度。我在算法方面有点弱,所以我还在琢磨如何优雅地完成这项工作 有人有什么建议吗?下面是我的原始脚本,我已经确保电子表格折叠空行,这样就不会浪费时间进行无内容的迭代Algorithm 加快查找和替换工作表的Google Apps脚本功能,algorithm,sorting,google-apps-script,google-sheets,Algorithm,Sorting,Google Apps Script,Google Sheets,我已经编写了一个非常简单的脚本,它成功地从Google电子表格中的一个工作表中获取信息,并在满足两个条件之前替换同一电子表格中另一个工作表中的列中的信息:接收行具有相同的“客户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];
}
函数replaceRawWithRepChanges(receivedSheet){
var ss=电子表格应用程序openById(已接收的表格);
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];
对于(var i=0;i
是的,您应该对数据进行排序(可能使用sort
命令,该命令可以处理多列)。然后,使用两个指针,只需向下搜索列一次,而不必检查整个repInfo
,以查找rawInfo
中每一行的匹配项
对信息进行排序后,循环可能如下所示:
var i = 0;
var j = 0;
while (i < rawInfo[0].length && j < repInfo[0].length) {
if (rawInfo[0][i].toString() == repInfo[0][j].toString()) {
if (rawInfo[2][i].toString() == repInfo[2][j].toString()) {
rawInfo[1][i]=repInfo[1][j];
i++;
j++;
} else if (rawInfo[2][i].toString() < repInfo[2][j].toString()) {
i++;
} else {
j++;
}
} else if (rawInfo[0][i].toString() < repInfo[0][j].toString()) {
i++;
} else {
j++;
}
}
var i=0;
var j=0;
而(i
是的,您应该对数据进行排序(可能使用sort
命令,该命令可以处理多列)。然后,使用两个指针,只需向下搜索列一次,而不必检查整个repInfo
,以查找rawInfo
中每一行的匹配项
对信息进行排序后,循环可能如下所示:
var i = 0;
var j = 0;
while (i < rawInfo[0].length && j < repInfo[0].length) {
if (rawInfo[0][i].toString() == repInfo[0][j].toString()) {
if (rawInfo[2][i].toString() == repInfo[2][j].toString()) {
rawInfo[1][i]=repInfo[1][j];
i++;
j++;
} else if (rawInfo[2][i].toString() < repInfo[2][j].toString()) {
i++;
} else {
j++;
}
} else if (rawInfo[0][i].toString() < repInfo[0][j].toString()) {
i++;
} else {
j++;
}
}
var i=0;
var j=0;
而(i
速度很慢,因为外循环中的每一行都要经过一次内循环。首先建立一个索引,然后对照该索引进行查找。这样做很慢,因为对于外部循环中的每一行,都要遍历一次内部循环。首先建立一个索引,然后查找该索引。