我在谷歌电子表格中使用功能脚本。
这个功能可能用于...... 150,000个小区。
我的问题是......无限加载。
当我在工作表中使用自定义功能时,会出现无限加载
我该如何解决?
这是我的脚本代码:
function s2hex(str1){
var s2hex = 0;
var byte_check = 0;
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("tbl");
var range1 = sheet1.getRange(1, 1, sheet1.getMaxRows(),
sheet1.getMaxColumns());
for(var i = 0; i < str1.length; ++i){
for(var k = 1; k < sheet1.getMaxRows(); ++k){
if(str1[i] == range1.getCell(k, 2).getValue() || str1[i] == " "){
s2hex = s2hex + 1;
byte_check = 1;
break;
}
}
if(byte_check == 0){
s2hex = s2hex + 2;
}
byte_check = 0;
}
return s2hex;
};
答案 0 :(得分:1)
getMaxRows()
将返回表单中的所有行。如果您在A1:A10
中有内容,并且从A10到A100000有空行。它将返回100,000而不是10.使用getLastRow()
代替。
如果您只使用第二列,请指定2
作为列号,1
代替getMaxColumns()
使用getValues()
获取单个数组,而不是多次调用电子表格。
尝试修改:
var range1 = sheet1.getRange(1, 1, sheet1.getMaxRows(), sheet1.getMaxColumns());
for(var i = 0; i < str1.length; ++i)
{
for(var k = 1; k < sheet1.getMaxRows(); ++k)
{
if(str1[i] == range1.getCell(k, 2).getValue() || str1[i] == " ")
{
s2hex = s2hex + 1;
要
var lr =sheet1.getLastRow(); //One last row call to be used in multiple places
var range = sheet1.getRange(1, 2, lr,1);
var range1 = range.getValues(); //get all values in a single call
for(var i = 0; i < str1.length; ++i)
{
for(var k = 0; k < lr; ++k) //k to 0.Array index start at 0
{
if(str1[i] == range1[k][0] || str1[i] == " ") //Check the 2D value of already retrieved array
{
s2hex = s2hex + 1;
答案 1 :(得分:0)
150,000个函数调用会减慢任何工作表的速度。
也就是说,您的功能迫切需要优化:您需要通过Spreadsheet接口消除对大量调用的需求。每次这样的呼叫可能需要0.1秒。您可以通过读取整个值范围来搜索getValues()
,然后以与当前相同的方式迭代它。