Google表格自定义功能计时

时间:2017-03-17 15:49:42

标签: javascript arrays multidimensional-array google-sheets

所以当我在一个相当大小的单元格范围内运行自定义函数时,我一直在错误地收到错误:“内部错误执行自定义函数”。

Google指定“自定义函数调用必须在30秒内返回。如果没有,则单元格将显示错误:执行自定义函数时出现内部错误。”

我的自定义功能是:

function ConcatLoop(rangeString, concatString, isPrefix, isOneColumn) {
  //var rangeString = "A1:A10,B1:B10,C1:C10";
  //var concatString = "1x ";
  //var isPrefix = "true";
  //var isOneColumn = "true";  

  var rangeStringArray = rangeString.split(',');
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var rangeValues=[];

  //GRABBING THE VALUES FROM EACH RANGE
  for(i=0;i<rangeStringArray.length;i++)
  {
    var range = sheet.getRange(rangeStringArray[i]);
    rangeValues.push(range.getValues());
  }

  if(isOneColumn){var newRangeValues = [[]]};

  //REMOVES EMPTY STRINGS AND ARRAYS OR CONCATENATES THE STRINGS
  for (i = 0; i < rangeValues.length; i++) {
    for (j = 0; j < rangeValues[i].length; j++){
      if (rangeValues[i][j] == "") 
      {         
        rangeValues[i].splice(j, 1);
        j--;
      }
      else if(isPrefix == "true")
      {
        rangeValues[i][j] = concatString + rangeValues[i][j];
        if(isOneColumn){newRangeValues[0].push(rangeValues[i][j])};
      }
      else
      {
        rangeValues[i][j] = rangeValues[i][j] + concatString;
        if(isOneColumn){newRangeValues[0].push(rangeValues[i][j])};
      }
    }
    if (rangeValues[i] ==""){
      rangeValues.splice(i,1);
      i--;
    }
  }

  //LOG WHILE TESTING
  //if(isOneColumn){Logger.log(JSON.stringify(newRangeValues))}
  //else{Logger.log("range values after concat: " + rangeValues)}

  //RETURN WHILE RUNNING
  if(isOneColumn){return newRangeValues}
  else{return rangeValues};
}

当我将1000个值插入到函数中时,拉取所有值需要相当长的时间。我在GOogle Scripts中测试时运行正常,因为那里没有时间限制。

如果有什么方法可以解决这个问题或者提高效率,有人可以告诉我吗?非常感谢你!

1 个答案:

答案 0 :(得分:0)

感谢那些评论过的令人难以置信的人,我之前确实找到了答案,所以我会把它发布给任何可能需要它的人。

Google为电子表格上的任何自定义功能的执行时间设置了30秒的限制。上面的任何内容都会给你一个内部错误。虽然脚本编辑器中的执行时间限制为5分钟,但如果脚本执行时间超过30秒,则可能存在问题。在我的情况下,我需要太多单独的范围来提取数据。所以我打电话给#34; getValues(范围)&#34;在for循环中很多次。

解决方案是将电子表格中的每个整张纸张作为一个范围。因此,对于我的27张床单中的每一张都不是7个范围,我的每张27张都有1个范围。这导致我在内存中有过多的不必要信息,但也导致执行时间从大约45秒到10秒。完全解决了我的问题。

谢谢!