所以当我在一个相当大小的单元格范围内运行自定义函数时,我一直在错误地收到错误:“内部错误执行自定义函数”。
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中测试时运行正常,因为那里没有时间限制。
如果有什么方法可以解决这个问题或者提高效率,有人可以告诉我吗?非常感谢你!
答案 0 :(得分:0)
感谢那些评论过的令人难以置信的人,我之前确实找到了答案,所以我会把它发布给任何可能需要它的人。
Google为电子表格上的任何自定义功能的执行时间设置了30秒的限制。上面的任何内容都会给你一个内部错误。虽然脚本编辑器中的执行时间限制为5分钟,但如果脚本执行时间超过30秒,则可能存在问题。在我的情况下,我需要太多单独的范围来提取数据。所以我打电话给#34; getValues(范围)&#34;在for循环中很多次。
解决方案是将电子表格中的每个整张纸张作为一个范围。因此,对于我的27张床单中的每一张都不是7个范围,我的每张27张都有1个范围。这导致我在内存中有过多的不必要信息,但也导致执行时间从大约45秒到10秒。完全解决了我的问题。
谢谢!