Google 脚本自定义函数错误解决方法
Google script custom function errors workaround
我在电子表格中使用自定义函数进行各种操作。
我使用了缓存值的属性服务。此外,我已将值范围发送给函数,而不是调用该函数数百次。
我正在为具有 100 行并且还在增长 的一列使用函数。我尝试在一个列中使用两列,但它超过了 30 秒 自定义函数限制。
不过,我收到了一些错误消息:
"Error: Internal error executing the custom function."
因为同一个自定义函数 50 次 同时计算 100 行.
的答案
我收到这条消息是关于 9 次 50。这并不奇怪,因为函数正在计算很多东西。
如果可以在不同的时间启动相同的自定义函数,如果自定义函数可以运行,问题就解决了在错误消息 后再次出现。也许还有另一种方法。
我试过应用指数退避,但我想用自定义函数不可能做到这一点。
我是 JavaScript 的新手,我试图为此找到解决方法,但没有成功。
这是调用此自定义函数的电子表格的图像:
这是我自定义函数的代码:
// Names - range of names e.g. A4:A100
// function is returning number if it meets conditions
function VSApmokyti(Names, date, place ) {
// if date and place is not arrays
if ( !Array.isArray(date) ) {
return Names.map (function (d) {
return process (d[0], date, place)
})
}
// if date and place is arrays
else {
return Names.map (function (d) {
return date[0].map (function (k, h) {
return process (d[0], k, place[0][h])
})
})
}
// this function can calculate no matter if date or place is arrays or values
function process(teacher, Vdate, school) {
if (Vdate=="") {
return null;
}
if (teacher=="") {
return null;
}
// Taking from CACHE
var cache = CacheService.getScriptCache();
var teachersL = cache.get("TeachersL");
teachersL = JSON.parse(teachersL);
var teachers1 = cache.get("Teachers1");
teachers1 = JSON.parse(teachers1);
var teachers2 = cache.get("Teachers2");
teachers2 = JSON.parse(teachers2);
var teachers3 = cache.get("Teachers3");
teachers3 = JSON.parse(teachers3);
var teachers4 = cache.get("Teachers4");
teachers4 = JSON.parse(teachers4);
var dates = cache.get("Dates");
dates = JSON.parse(dates);
var Schools = cache.get("Schools");
Schools = JSON.parse(Schools);
var number = cache.get("NumberScholars");
number = JSON.parse(number);
if (!number) {
// WRITING to CACHE
var TeachersL = PropertiesService.getScriptProperties().getProperty('TeachersL');
cache.put('TeachersL', TeachersL);
teachersL = JSON.parse(TeachersL);
var Teachers1 = PropertiesService.getScriptProperties().getProperty('Teachers1');
cache.put('Teachers1', Teachers1);
teachers1 = JSON.parse(Teachers1);
var Teachers2 = PropertiesService.getScriptProperties().getProperty('Teachers2');
cache.put('Teachers2', Teachers2);
teachers2 = JSON.parse(Teachers2);
var Teachers3 = PropertiesService.getScriptProperties().getProperty('Teachers3');
cache.put('Teachers3', Teachers3);
teachers3 = JSON.parse(Teachers3);
var Teachers4 = PropertiesService.getScriptProperties().getProperty('Teachers4');
cache.put('Teachers4', Teachers4);
teachers4 = JSON.parse(Teachers4);
var Dates = PropertiesService.getScriptProperties().getProperty('Dates');
cache.put('Dates', Dates);
dates = JSON.parse(Dates);
var Schools = PropertiesService.getScriptProperties().getProperty('Schools');
cache.put('Schools', Schools);
Schools = JSON.parse(Schools);
var NumberScholars = PropertiesService.getScriptProperties().getProperty('NumberScholars');
cache.put('NumberScholars', NumberScholars);
number = JSON.parse(NumberScholars);
}
// converting date from spreadsheet cell to be able check if condition
Vdate = Vdate.toJSON();
for(var y = 0; y < Schools.length; y++) {
if(Vdate==dates[y] && school==Schools[y]) {
if ((teacher==teachersL[y]) || (teacher==teachers1[y]) || (teacher==teachers2[y]) || (teacher==teachers3[y]) || (teacher==teachers4[y])) {
return number[y];
}
}
}
}
}
有几种方法可以处理 Apps 脚本中的错误。一种不太困难的方法是使用 try and catch。例如,下面的代码会将函数 运行ning 时发生的任何错误的日志写入 sheet。另外 try and catch 是 none 阻塞所以即使有错误功能也不会停止。这是一个将错误记录到 Google sheet 中的示例。
function somefunction(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var logSheet = ss.getSheetByName('Sheet1');
try {
myFunctionThatMightHaveErrors()
}
catch(e){
var now = new Data();
var error = JSON.stringify(e);
logSheet.appendRow([now, error]);
}
}
仅供参考:应用程序脚本将 运行 任何功能最多持续 6 分钟,除非您的域拥有 Gsuite 企业帐户和应用程序制造商。但是如果需要的话,有一些方法可以绕过时间限制。
简答
与其使用 return 单个值的自定义函数,不如将其设为 return 值数组。
说明
自定义函数可以 return 单个值或值数组。如果您将自定义函数应用于连续的单元格,而不是将 returns 一个值应用于每个单元格的公式导致多次计算,您可以使用一个公式 returns 一个值数组但承担请记住,自定义函数的执行时间限制为 30 秒。参见 Optimization
如果您的函数超过 30 秒限制,则使用 "regular" 函数,该函数将由自定义菜单、对话框、边栏、触发器或从 Google Apps 脚本编辑器调用。此类函数对于普通帐户的执行时间限制为 6 分钟,对于注册到 Early Access Program.
的 G Suite 帐户的执行时间限制为 30 分钟
我在电子表格中使用自定义函数进行各种操作。 我使用了缓存值的属性服务。此外,我已将值范围发送给函数,而不是调用该函数数百次。
我正在为具有 100 行并且还在增长 的一列使用函数。我尝试在一个列中使用两列,但它超过了 30 秒 自定义函数限制。
不过,我收到了一些错误消息:
"Error: Internal error executing the custom function."
因为同一个自定义函数 50 次 同时计算 100 行.
的答案我收到这条消息是关于 9 次 50。这并不奇怪,因为函数正在计算很多东西。
如果可以在不同的时间启动相同的自定义函数,如果自定义函数可以运行,问题就解决了在错误消息 后再次出现。也许还有另一种方法。
我试过应用指数退避,但我想用自定义函数不可能做到这一点。
我是 JavaScript 的新手,我试图为此找到解决方法,但没有成功。
这是调用此自定义函数的电子表格的图像:
这是我自定义函数的代码:
// Names - range of names e.g. A4:A100
// function is returning number if it meets conditions
function VSApmokyti(Names, date, place ) {
// if date and place is not arrays
if ( !Array.isArray(date) ) {
return Names.map (function (d) {
return process (d[0], date, place)
})
}
// if date and place is arrays
else {
return Names.map (function (d) {
return date[0].map (function (k, h) {
return process (d[0], k, place[0][h])
})
})
}
// this function can calculate no matter if date or place is arrays or values
function process(teacher, Vdate, school) {
if (Vdate=="") {
return null;
}
if (teacher=="") {
return null;
}
// Taking from CACHE
var cache = CacheService.getScriptCache();
var teachersL = cache.get("TeachersL");
teachersL = JSON.parse(teachersL);
var teachers1 = cache.get("Teachers1");
teachers1 = JSON.parse(teachers1);
var teachers2 = cache.get("Teachers2");
teachers2 = JSON.parse(teachers2);
var teachers3 = cache.get("Teachers3");
teachers3 = JSON.parse(teachers3);
var teachers4 = cache.get("Teachers4");
teachers4 = JSON.parse(teachers4);
var dates = cache.get("Dates");
dates = JSON.parse(dates);
var Schools = cache.get("Schools");
Schools = JSON.parse(Schools);
var number = cache.get("NumberScholars");
number = JSON.parse(number);
if (!number) {
// WRITING to CACHE
var TeachersL = PropertiesService.getScriptProperties().getProperty('TeachersL');
cache.put('TeachersL', TeachersL);
teachersL = JSON.parse(TeachersL);
var Teachers1 = PropertiesService.getScriptProperties().getProperty('Teachers1');
cache.put('Teachers1', Teachers1);
teachers1 = JSON.parse(Teachers1);
var Teachers2 = PropertiesService.getScriptProperties().getProperty('Teachers2');
cache.put('Teachers2', Teachers2);
teachers2 = JSON.parse(Teachers2);
var Teachers3 = PropertiesService.getScriptProperties().getProperty('Teachers3');
cache.put('Teachers3', Teachers3);
teachers3 = JSON.parse(Teachers3);
var Teachers4 = PropertiesService.getScriptProperties().getProperty('Teachers4');
cache.put('Teachers4', Teachers4);
teachers4 = JSON.parse(Teachers4);
var Dates = PropertiesService.getScriptProperties().getProperty('Dates');
cache.put('Dates', Dates);
dates = JSON.parse(Dates);
var Schools = PropertiesService.getScriptProperties().getProperty('Schools');
cache.put('Schools', Schools);
Schools = JSON.parse(Schools);
var NumberScholars = PropertiesService.getScriptProperties().getProperty('NumberScholars');
cache.put('NumberScholars', NumberScholars);
number = JSON.parse(NumberScholars);
}
// converting date from spreadsheet cell to be able check if condition
Vdate = Vdate.toJSON();
for(var y = 0; y < Schools.length; y++) {
if(Vdate==dates[y] && school==Schools[y]) {
if ((teacher==teachersL[y]) || (teacher==teachers1[y]) || (teacher==teachers2[y]) || (teacher==teachers3[y]) || (teacher==teachers4[y])) {
return number[y];
}
}
}
}
}
有几种方法可以处理 Apps 脚本中的错误。一种不太困难的方法是使用 try and catch。例如,下面的代码会将函数 运行ning 时发生的任何错误的日志写入 sheet。另外 try and catch 是 none 阻塞所以即使有错误功能也不会停止。这是一个将错误记录到 Google sheet 中的示例。
function somefunction(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var logSheet = ss.getSheetByName('Sheet1');
try {
myFunctionThatMightHaveErrors()
}
catch(e){
var now = new Data();
var error = JSON.stringify(e);
logSheet.appendRow([now, error]);
}
}
仅供参考:应用程序脚本将 运行 任何功能最多持续 6 分钟,除非您的域拥有 Gsuite 企业帐户和应用程序制造商。但是如果需要的话,有一些方法可以绕过时间限制。
简答
与其使用 return 单个值的自定义函数,不如将其设为 return 值数组。
说明
自定义函数可以 return 单个值或值数组。如果您将自定义函数应用于连续的单元格,而不是将 returns 一个值应用于每个单元格的公式导致多次计算,您可以使用一个公式 returns 一个值数组但承担请记住,自定义函数的执行时间限制为 30 秒。参见 Optimization
如果您的函数超过 30 秒限制,则使用 "regular" 函数,该函数将由自定义菜单、对话框、边栏、触发器或从 Google Apps 脚本编辑器调用。此类函数对于普通帐户的执行时间限制为 6 分钟,对于注册到 Early Access Program.
的 G Suite 帐户的执行时间限制为 30 分钟