您可以使用导入的独立脚本中的函数作为单元格公式自定义函数吗?

时间:2018-05-14 02:24:22

标签: google-apps-script google-sheets

我已将具有基本库功能的独立Google App脚本项目(名为SheetUtilities)导入另一个Google表单文档(SheetTest)。我希望将SheetUtilities中的函数用作SheetTest中的单元格公式中的自定义函数。

我可以在SheetTest中的脚本编辑器中成功调用这些函数,例如:

function wrapperfunc(){
  SheetUtilities.foo();
}

但是,如果进入单元格并致电=foo()=SheetUtilities.foo(),我会收到#NAME?错误。如何在目标工作表文档中提供这些导入的库函数?我希望这个库可以在我的所有工作表中使用。

我知道这可以使用Sheets Addons,例如来自Google的Date Add Subtract add添加了一些新的单元格功能。但是,我不想发布添加以获得相同的结果。

1 个答案:

答案 0 :(得分:2)

是的,你可以 - 但是涉及到一些诡计。另外,我没有考虑源脚本和导入的库定位不同范围的场景。请注意,自定义功能在功能方面非常有限,无法访问许多高级服务。

使用自定义功能,您只能定位全局范围。此外,您的SheetUtilities对象不是一个函数,但从技术上讲,一切都是JavaScript中的对象。

总而言之,似乎从电子表格单元格中,您只能引用1)位于全局范围内的“对象”类型2)继承自Function.prototype

我能想到的唯一解决方案是专门编写函数来调用库中的嵌套函数。作为第一个参数,我们将以下列格式传递字符串

  

“LIBNAME.FUNCNAME”

后跟函数本身的参数列表。

function CALL_LIB(libDotFunc){

  var arr = libDotFunc.split("."); //a string to array with "." as separator
  var lib = arr[0]; //getting library name
  var func = arr[1]; //getting function name
  var args = Array.prototype.slice.call(arguments); //convert arguments object to an array
  var params = args.slice(1); //this will return any other arguments passed to the function

  return this[lib][func].apply(this, params);

}

库只是第一个'this'所指向的全局对象的属性。相反,嵌套函数是库对象的属性之一。

this[lib][func] //selecting the function to be executed

最后,我们调用函数传递所需的参数。在这个阶段,我们必须让'this'对象指向函数本身(点左边的变量)。

return this[lib][func].apply(this, params);

然后,您可以从像这样的单元格中调用库函数

enter image description here