Google 工作表自定义函数超时
Google Sheets Custom Function Timing Out
所以我一直不规律地收到错误:"Internal Error Executing the Custom Function" 当 运行 我的自定义函数在适当大小的单元格范围内时。
Google 指定 "A custom function call must return within 30 seconds. If it does not, the cell will display an error: Internal error executing the custom function."
我的自定义函数是这样的:
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 脚本中测试它时它运行良好,因为那里没有时间限制。
如果我能做些什么来解决这个问题或提高它的效率,有人可以告诉我吗?非常感谢!
感谢发表评论的优秀人士,我确实在早些时候找到了答案,所以我将 post 提供给可能需要的人。
Google 将任何自定义函数在价差 sheet 上的执行时间限制为 30 秒。以上任何内容都会给您带来内部错误。尽管脚本编辑器中的执行时间有 5 分钟的限制,但如果您的脚本执行时间超过 30 秒,则可能存在问题。就我而言,我需要从太多单独的范围中提取数据。所以我在 for 循环中多次调用 "getValues(range)"。
解决方案是将价差sheet 中的每个 sheet 作为一个范围。因此,我的 27 个 sheet 中的每一个都没有 7 个范围,我的 27 个 sheet 中的每一个都有 1 个范围。这导致我在内存中有过多不必要的信息,但也导致执行时间从大约 45 秒减少到 10 秒。彻底解决了我的问题。
谢谢!
所以我一直不规律地收到错误:"Internal Error Executing the Custom Function" 当 运行 我的自定义函数在适当大小的单元格范围内时。
Google 指定 "A custom function call must return within 30 seconds. If it does not, the cell will display an error: Internal error executing the custom function."
我的自定义函数是这样的:
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 脚本中测试它时它运行良好,因为那里没有时间限制。
如果我能做些什么来解决这个问题或提高它的效率,有人可以告诉我吗?非常感谢!
感谢发表评论的优秀人士,我确实在早些时候找到了答案,所以我将 post 提供给可能需要的人。
Google 将任何自定义函数在价差 sheet 上的执行时间限制为 30 秒。以上任何内容都会给您带来内部错误。尽管脚本编辑器中的执行时间有 5 分钟的限制,但如果您的脚本执行时间超过 30 秒,则可能存在问题。就我而言,我需要从太多单独的范围中提取数据。所以我在 for 循环中多次调用 "getValues(range)"。
解决方案是将价差sheet 中的每个 sheet 作为一个范围。因此,我的 27 个 sheet 中的每一个都没有 7 个范围,我的 27 个 sheet 中的每一个都有 1 个范围。这导致我在内存中有过多不必要的信息,但也导致执行时间从大约 45 秒减少到 10 秒。彻底解决了我的问题。
谢谢!