2016-09-20 27 views
1

谷歌脚本的电子表格 新手谷歌脚本 - 超过最长执行时间,有利于优化

我尝试创建一个矩阵,如果阵列是如果超过800线多休息一个小型的数据库一切正常,当然对错误“您已经超出了允许的最大运行时间”。不能有效地创建一个矩阵:

var s = SpreadsheetApp.getActiveSheet(); //List 
 
var toAddArray = []; //Greate Arr 
 
    for (i = 1; i <= s.getLastRow()+1; ++i){ //Start getting Value 
 
    var numbr = s.getRange(i,4); //detect range 
 
    var Valus = numbr.getValues().toString(); //get value 
 
    
 
    //filter value 
 
    var newznach = Valus.replace(/\-/g, "").replace(/[0-9][0-9][0-9][0-9][0-9][a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]/g, "").replace(/[a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]/g, ""); 
 
    toAddArray.push([i.toFixed(0),Valus,newznach]); //add to array 0- Row numb, 1- Value, 2- "filtered" value 
 
    }

toAddArray =

{ 
Row, Value, NewValue - filtered 
Row, Value, NewValue - filtered 
Row, Value, NewValue - filtered 
... 
} 

我可以以某种方式得到相同的其他方式的阵列(更快,更方便)?

+0

答案已经在这里涵盖:https://developers.google.com/apps-script/best_practices –

回答

2

您正在调用getValues的每一行,从而获得大量的性能。
最好做一个大的调用来获得所有的数据,然后顺序地通过它。

var s = SpreadsheetApp.getActiveSheet(); 
var data = s.getRange(1,4, s.getLastRow()).getValues(); 

var toAddArray = data.map(function(row, i) { 
    var Valus = row[0].toString(); 
    var newznach = Valus. 
    replace(/\-/g, ""). 
    replace(/[0-9][0-9][0-9][0-9][0-9][a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]/g, ""). 
    replace(/[a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]/g, ""); 

    return [i.toFixed(0), Valus, newznach]; 
}); 
+0

谢谢你,也认识到,麻烦的是,的GetValue在每个周期执行。 我的拐杖是为了使它在循环中,如:var Valus = numbr.getValues()。toString()。split(“,”); toAddArray.push([i.toFixed(0),衣被合计[I-1],newznach]); 但是您毫不怀疑,代码更加正确和美观 –

+0

使用您的代码,对于1500行的表格,运行时间为0.254秒 –

1

验证码:因为你从纸张的循环中读取数据

var Valus = numbr.getValues().toString(); 

减慢你失望。

尝试读取数据一旦进入数组,然后使用它:

var data = s.getDataRange().getValues(); 

然后用data工作,在一个循环。此示例代码登录活动工作表每个单元:

function logEachCell() { 
    var s = SpreadsheetApp.getActiveSheet(); 
    var data = s.getDataRange().getValues(); 

    // loop each cell 
    var row = []; 
    for (var i = 0; i < data.length; i++) { 
    row = data[i]; 
    for (var j = 0; j < row.length; j++) { 
     Logger.log(row[j])  
    } 
    } 
}