首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加快数组操作Google Apps脚本的执行速度

加快数组操作Google Apps脚本的执行速度
EN

Stack Overflow用户
提问于 2016-09-02 23:19:39
回答 1查看 50关注 0票数 0

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

到目前为止,该脚本在耗尽时间之前只能处理10k行。

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

这是我现在的代码:

代码语言:javascript
运行
复制
     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:抱歉,如果我把一些变量的名字改成post em时弄乱了。

干杯,

EN

回答 1

Stack Overflow用户

发布于 2016-09-02 23:30:49

那么,无论何时调用google库,都会耗费您的时间。

这意味着,如果你设法将这两行代码从循环中去掉,你很可能会成功。

代码语言:javascript
运行
复制
var toCopy = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FINAL").getRange(3, 3, data1Length - 2, data1LengthHorizontal - 2); //HardCoded Starting Point
      toCopy.setValues(results);

在循环内部,尝试只处理数组、记住索引、行等,然后根据保存在循环内的数据,在循环外部调用getRangesetValues

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39295821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档