在Google脚本中优化数据“获取/匹配”

时间:2016-09-18 23:42:45

标签: javascript performance google-apps-script google-sheets

我有一些工作正常的代码,只是相当缓慢和笨重。我确定有更好的方法:

我有两张纸,一张是用户编辑的('MAIN'),另一张是脚本从中提取数据(超过5000行数据)('REF')。基本上它会检查第1列的匹配项,如果它与用户输入的匹配项匹配,则会从第3列的同一行中获取值。

代码有效,但速度很慢:

function onEdit(){
  var s = SpreadsheetApp.getActive().getSheetByName('MAIN');
  var sref = SpreadsheetApp.getActive().getSheetByName('REF');

  var activeRow = s.getActiveCell().getRow();
  var activeCol = s.getActiveCell().getColumn();
  var activeCell = s.getActiveCell().getValue();

  var mainPageBranch = s.getRange(8,1).getValue();
  var refPageBranch = sref.getRange('I4').getValue();

  var lastrow = sref.getLastRow();

  if(activeCol == '2' || activeCol == '5' || activeCol == '8' || activeCol == '11' || activeCol == '14' || activeCol == '17' || activeCol == '20'){
    if(activeRow > 9 && activeRow < 41){
      if(activeCell > 100000){
        s.getRange(activeRow, activeCol+1).setValue(1);
      }
      else{
        s.getRange(activeRow, activeCol+1).setValue('');
      }
      for(var i=5; i <lastrow; i++){
        var productCode = sref.getRange(i, 1).getValue();
        if(activeCell == productCode){
          var essMould = sref.getRange(i,3).getValue();
          s.getRange(activeRow+1,activeCol).setValue(essMould);
          s.getRange(activeRow+1,activeCol+1).setValue('1');
          break;
        }
      }
      Logger.log('Product Code: ' + productCode);
      Logger.log('Ess Mould: ' + essMould);
      Logger.log('Last Row: ' + lastrow);
    }
  }
}

我知道它有点笨重 - 任何使它更快的帮助都会很棒!

如果您还需要其他信息,请告诉我们。)

编辑:这是更新的代码谢谢!

function onEdit(){
  var s = SpreadsheetApp.getActive().getSheetByName('MAIN');
  var sref = SpreadsheetApp.getActive().getSheetByName('REF');

  var activeRow = s.getActiveCell().getRow();
  var activeCol = s.getActiveCell().getColumn();
  var activeCell = s.getActiveCell().getValue();

  var mainPageBranch = s.getRange(8,1).getValue();
  var refPageBranch = sref.getRange('I4').getValue();

  var lastrow = sref.getLastRow();

  var productCode,essMould,data,L;

  data = sref.getRange(5, 1, lastrow-5,3).getValues();
  L = data.length; //Length of data

  if(activeCol == '2' || activeCol == '5' || activeCol == '8' || activeCol == '11' || activeCol == '14' || activeCol == '17' || activeCol == '20'){
    if(activeRow > 9 && activeRow < 41){
      if(activeCell > 100000){
        s.getRange(activeRow, activeCol+1).setValue(1);
      }
      else{
        s.getRange(activeRow, activeCol+1).setValue('');
      }
      for(var i=5; i <L; i++){
        productCode = data[i][0];
        if(activeCell == productCode){
          essMould = data[i][2];
          s.getRange(activeRow+1,activeCol).setValue(essMould);
          s.getRange(activeRow+1,activeCol+1).setValue('1');
          break;
        }
      }
      Logger.log('Product Code: ' + productCode);
      Logger.log('Ess Mould: ' + essMould);
    }
  }
}

1 个答案:

答案 0 :(得分:1)

你不应该在每个循环中获得单独的值:

var callIt = function(fn, ...args) {
    var res = 0;
    for(var i = 0; i < args.length; i++){
        res += fn(args[i]);
    }
    return res
 };

var result = callIt(function(n) {
  return n
}, 2,3);

console.log(result);

首先获取所有值,遍历数据数组,根据需要更改数组中的数据,然后将整个数据集写回电子表格。

for(var i=5; i <lastrow; i++){
  var productCode = sref.getRange(i, 1).getValue();