【问题标题】:Faster Alternative to a For Loop Google App Script JavascriptFor Loop Google App Script Javascript 的更快替代方案
【发布时间】:2020-11-17 08:44:09
【问题描述】:

我创建了一个 for 循环,它从数组 (salesLog) 中提取列中的销售数据并将它们放入工作表 (targetSheet)。销售数据保存在多列中。 columnStart 和 columnEnd 之间的列被添加(单位),与源工作表中的正确行匹配,并放置在 targetSheet 中的正确行中。这个循环工作得很好,只是它太慢了,而且担心更多的数据无法扩展。我正在寻找一种更快地运行此循环的方法。有什么帮助吗?

var length = POlistTarget.length;

for (var i=0; i <= length; i++){
  //find Row
  var row = POlistSource.indexOf(POlistTarget[i]);

  //findColumns
  var columnStart = periodArr[0]+1
  var columnEnd = periodArr.length
  var unitArr = 
salesLog.getRange(row+3,columnStart,1,columnEnd).getValues().flat().filter(row=>row!="");

  //add units in an array
  var unit = unitArr.reduce(function(a,b){return a+b;},0);



  //execute



    targetSheet.getRange(i+4,7,1,1).setValue(unit);
   
}

【问题讨论】:

  • 我认为您的脚本不完整。所以,虽然这是我从你的脚本中猜到的,但如果你在循环中使用getValues()setValue。在这种情况下,处理成本会很高。修改它们怎么样?如果我的理解是正确的,Best Practicesstackoverflow.com/tags/google-apps-script/info 可能会有用。如果我误解了你的剧本,我深表歉意。
  • 一种方法是跳过filter,直接使用reduce
  • This loop works fine 怎么样?你有一个 else 声明,那里没有 if 声明。请提供完整代码。
  • 对不起。我在循环中有一个 if 语句对于这个问题的概念并不重要,并且忘记删除它后面的 else 语句。谢谢!我已经相应地编辑了代码。

标签: javascript arrays for-loop google-apps-script google-sheets


【解决方案1】:

解释:

  • 正如Tanaike 在他的评论中提到的那样,主要的改进是在 for 循环之外使用 setValues once 而不是在 for 循环内使用 setValue 迭代。这样,您将拨打一个电话来设置数据,而不是POlistTarget.length 电话。在best practices 中查看更多详细信息。

  • 在性能和代码格式方面的另一项改进是使用forEach 而不是 for 循环。这个想法是摆脱不必要的代码。

改进的解决方案:

const units = [];
POlistTarget.forEach((pt,i)=>{                         
        let row =  POlistSource.indexOf(pt);
        let columnStart = periodArr[0]+1;
        let columnEnd = periodArr.length;
        let unit = salesLog.getRange(row+3,columnStart,1,columnEnd).
                   getValues().
                   flat().
                   filter(r=>r!='').
                   reduce((a,b)=>a+b);
        units.push([unit]);                     
});

targetSheet.getRange(4,7,units.length,1).setValues(units);

更多改进:

如果您的代码是完整的,我们可以看看是否可以将getRange 用于salesLog 上的完整数组,这样您就可以在for 循环中摆脱getRange。这样,您可以完全跳过 for 循环。

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2020-11-10
    • 1970-01-01
    • 2020-11-14
    相关资源
    最近更新 更多