自定义函数不断抛出错误

时间:2019-04-27 18:10:42

标签: google-apps-script google-sheets google-sheets-formula custom-function

我编写了一个自定义单元内函数,仅当给定单元格不为空时才具有指定的数据验证列表。这是该功能:

function CONDITIONALVALIDATION(sheetName,cellToCheckA1,validationCell,validationItems){
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName(sheetName);
  var cellValue = sheet.getRange(cellToCheckA1).getValue();
  var cellToSet = sheet.getRange(validationCell);
  cellToSet.clearDataValidations();
  if(cellValue!=""){
  var unitsRule = SpreadsheetApp.newDataValidation().requireValueInList(validationItems, true);
    cellToSet.setDataValidation(unitsRule)
  }
}

当我调用一个填充CONDITIONALVALIDATION函数参数的测试函数并在编辑器中运行它时,我看到了所需的结果。该函数如下:

function testconditional(){
  CONDITIONALVALIDATION("Front End","E12","F12",["x","y"]);
}

但是,当我将该函数作为自定义单元内函数调用时,我不断得到

  

“公式解析错误。”

我已经排除了可能的语法原因;在我的测试函数中对该函数的调用与在自定义单元内函数中对其的调用完全相同。当然,在函数调用之前保存等号以指示它是要运行的函数。我也知道该功能可以通过工作表识别;没有“功能不存在”或“ #NAME?”在单元格中调用该函数时出错。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

问题:

Javascript数组文字[]无效的电子表格公式语法。尝试使用{}代替:

=CONDITIONALVALIDATION("Front End","E12","F12",{"x","y"});

如上所述,自定义功能不能.setDataValidation(unitsRule)

  

电子表格

     
    

只读(可以使用大多数get *()方法,但不能使用set *())。

  

解决方案:

  

要使用除上面列出的服务以外的其他服务,请创建一个运行Apps脚本功能的自定义菜单,而不是编写一个自定义功能。通过菜单触发的功能将在必要时询问用户授权,因此可以使用所有Apps Script服务。

答案 1 :(得分:1)

Google Apps脚本自定义函数无法对对象(电子表格,表格,范围等)进行更改。它们只能返回一个值或值的数组。

参考https://developers.google.com/apps-script/guides/sheets/functions

关于公式分析错误消息,当公式具有“常规公式语法检查器”未捕获的某些语法错误(例如数组上存在语法错误)时,就会发生该错误。

正如已经提到的,一种替代方法是使用自定义菜单。通常不会提及on edit触发器,因为当公式的结果发生更改时不会触发它们,但是在某些情况下可能会起作用,例如,预期使用过的单元格编辑会进行更改。