在功能脚本中的谷歌电子表格中无限加载

时间:2018-03-19 00:20:30

标签: google-apps-script google-sheets

我在谷歌电子表格中使用功能脚本。

这个功能可能用于...... 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;
};

2 个答案:

答案 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(),然后以与当前相同的方式迭代它。