【问题标题】:Speed up execution of array manipulating Google Apps Script加快执行数组操作 Google Apps 脚本
【发布时间】:2016-09-02 23:30:48
【问题描述】:

我需要这个脚本来处理一个包含 20k 行、50 列的大表。

截至目前,该脚本仅能处理 10k 行,然后就超时了。

我已经尝试过尽可能优化,但我担心我的能力已经到了极限:

这是我现在的代码:

     function updateValues() {
      var ws1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FINAL").getDataRange();
      var ws3List = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("WS2").getDataRange().getValues();
      var ws2List = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("WS3").getDataRange().getValues();
      var results = new Array;
      var data1 = ws1.getValues();
      var data1Length = data1.length;
      var ws2Length = ws2List.length;
      var ws3Length = ws3List.length;
      var data1LengthHorizontal = data1[1].length;
      for ( var i = 2; i < data1Length; i++ ) {
        var iterHotel = data1[i][0];
        results[i-2] = [];
        for ( var nn=0; nn < ws2Length; ++nn ){
          if (iterHotel == ws2List[nn][2]){
            var ws2Code = ws2List[nn][4];
            break;
          }
        }
// First Vlookup
        var ws3Check;
        for ( var nn=0; nn < ws3Length; ++nn ){
          if (iterHotel == ws3List[nn][0]){
            ws3Check = true;
            break;
          }
          ws3Check = false;
        }
// Second Vlookup
        var score;
        var countries = data1[0];
        if (ws3Check) {score = aCalculator1(ws2Code);} else {score = aCalculator2(ws2Code);}
        for ( var i1 = 2; i1 < data1LengthHorizontal; i1++){
          if (data1[0][i1] == "ALL" || countries[i1].indexOf(data1[i][1]) > -1) {results[i-2][i1-2] = score;} 
          else {results[i-2][i1-2] = 1;}      
        }
      }
      var toCopy = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FINAL").getRange(3, 3, data1Length - 2, data1LengthHorizontal - 2); //HardCoded Starting Point
      toCopy.setValues(results);
    }

    function aCalculator1(ws2Code) {
        switch (ws2Code) {
          case 3:
            return 75;
          case 2:
            return 75;
          case 1:
            return 95;
          case 0:
            return 1;
          default:
            return 1;  
        }
    }

    function aCalculator2(ws2Code) {
        switch (ws2Code) {
          case 3:
            return 10;
          case 2:
            return 10;
          case 1:
            return 10;
          case 0:
            return 1;
          default:
            return 1;  
        }
    }

你怎么看?你能看到要调整的东西吗?我应该如何解决这个问题?也许分割块?

PS:对不起,如果我在更改名称以发布它们时弄乱了一些变量。

干杯,

【问题讨论】:

    标签: javascript loops optimization google-apps-script


    【解决方案1】:

    好吧,每当您向谷歌图书馆打电话时,都会耗费您的时间。

    这意味着,如果您设法以某种方式使这两行脱离循环,您很可能会成功。

    var toCopy = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FINAL").getRange(3, 3, data1Length - 2, data1LengthHorizontal - 2); //HardCoded Starting Point
          toCopy.setValues(results);
    

    在循环内部尝试仅使用数组,记住索引,行行等,然后根据您保存在循环内部的数据调用getRangesetValues 在循环外部循环。

    【讨论】:

    • 我在最后调用它,在循环之外。问题出在循环本身,我只达到 10k / 19k(我测试了记录主循环的变量 i)
    • 啊,我明白了。 @PaulT。你能复制一份电子表格并分享给我们吗?我想重现我这边的问题,然后尝试解决它。如果它包含敏感数据,只需将其替换为随机文本。问题并不明显(对我而言)
    • 可以将超过执行超时的大型操作分成多个部分,并使用基于时间的触发器进行处理。当您使用数组时,您可以使用脚本属性来存储数组位置,这样当脚本再次触发时,使用基于时间的触发器,它会从之前停止的位置开始处理数组。
    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多