【问题标题】:Google Sheets Custom Function Timing Out谷歌表格自定义功能超时
【发布时间】:2017-03-17 15:49:42
【问题描述】:

因此,当在适当大小的单元格范围上运行我的自定义函数时,我一直不规律地收到错误:“执行自定义函数的内部错误”。

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 中测试它时,它运行良好,因为那里没有时间限制。

如果我能做些什么来解决这个问题或提高效率,有人可以告诉我吗?非常感谢!

【问题讨论】:

  • 你通过的范围可以是 A1:C10 还是你要走多远?时间消耗在 getValues() 调用中。 Googles Best Practices 建议尽可能拨打 1 个电话
  • 它正在处理多张纸。我也需要特定的列,例如 Sheet1!A1:A100 和 Sheet2!E1:E:100 等。此时我可能会拨打 150 次电话。所以我应该在 1 范围内浏览整个工作表?这会将其压缩到 27 个电话。有 27 张。
  • 如果您有 27 张纸,您如何在每张纸上拨打多个电话?您能否分享一个示例,说明如何使用示例参数从电子表格中调用此函数
  • 我用逗号分割一串范围,创建一个范围数组。所以我会传入类似的内容:“Sheet1!A1:A100,Sheet1!B1:B100,Sheet2!A1:A100,Sheet2!B1:B100”然后我将它放入for循环并不断调用getValues()
  • 您可以改为传递 Sheet1!A1:B100,Sheet2A1:B100 等等。这将减少对 getValues() 的调用次数并提高执行速度。根据您之前的评论,我相信这就是您打算做的事情。如果这不起作用,您可以从脚本编辑器调用该函数,它有 5 分钟的执行时间限制。希望对您有所帮助,一切顺利

标签: javascript arrays google-apps-script google-sheets google-sheets-custom-function


【解决方案1】:

感谢评论的不可思议的人,我之前确实找到了答案,所以我将把它发布给任何可能需要它的人。

Google 将电子表格上任何自定义函数的执行时间限制为 30 秒。上面的任何东西都会给你一个内部错误。尽管脚本编辑器中的执行时间限制为 5 分钟,但如果您的脚本执行时间超过 30 秒,则可能会出现问题。就我而言,我有太多单独的范围需要从中提取数据。所以我在 for 循环中多次调用“getValues(range)”。

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

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多