加快工作表的查找和替换Google Apps脚本功能

时间:2018-07-24 01:51:13

标签: algorithm sorting google-apps-script google-sheets

我编写了一个非常简单的脚本,该脚本成功地从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];
}

1 个答案:

答案 0 :(得分:2)

是的,您应该对数据进行排序(也许使用SORT命令,该命令适用于多列)。然后,使用两个指针,您只需向下浏览一次列,而无需检查整个repInfo的{​​{1}}中每一行的匹配情况。

对信息进行排序后,循环可能如下所示:

rawInfo