我在电子表格中使用自定义函数进行各种操作。 我使用了缓存值的属性服务。另外,我已将值范围发送给函数,而不是调用该函数数百次。

我正在对一列使用函数,100 行并且还在增长。我尝试一次获取两列,但它超出了 30 秒 自定义函数限制。

尽管如此,我还是收到了一些错误消息:

"Error: Internal error executing the custom function."

因为同一个自定义函数同时50次计算这100行的答案。

我大约收到此消息 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]; 
 
        } 
      } 
    } 
 
} 
} 

请您参考如下方法:

简短回答

不要使用返回单个值的自定义函数,而是使其返回值数组。

说明

自定义函数可以返回单个值或值数组。如果您将自定义函数应用于连续单元格,而不是应用向每个单元格返回值的公式导致多次计算,您可以使用返回值数组的单个公式,但请记住自定义函数有 30 秒的时间时间执行限制。请参阅Optimization

如果您的函数超过 30 秒限制,请使用“常规”函数,该函数将由自定义菜单、对话框、侧边栏、触发器或从 Google Apps 脚本编辑器调用。此类功能对于普通帐户的执行时间限制为 6 分钟,对于注册 Early Access Program 的 G Suite 帐户执行时间限制为 30 分钟。 .


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!