Google apps script 能否将导入的独立脚本中的函数用作单元格公式自定义函数?

Google apps script 能否将导入的独立脚本中的函数用作单元格公式自定义函数?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我已经将一个独立的Google应用程序脚本项目(称为SheetUtilities)导入到另一个Google工作表文档(SheetTest)中,该项目具有基本的库函数。我想将SheetUtilities中的函数用作SheetTest中单元格公式中的自定义函数 我可以在SheetTest中成功调用脚本编辑器中的函数,例如: function wrapperfunc(){ SheetUtilities.foo(); } 但是,如果进入一个单元格并调用=foo()或=SheetUtilities.

我已经将一个独立的Google应用程序脚本项目(称为
SheetUtilities
)导入到另一个Google工作表文档(
SheetTest
)中,该项目具有基本的库函数。我想将
SheetUtilities
中的函数用作
SheetTest
中单元格公式中的自定义函数

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

function wrapperfunc(){
  SheetUtilities.foo();
}
但是,如果进入一个单元格并调用
=foo()
=SheetUtilities.foo()
我会得到一个
#NAME?
错误。如何使这些导入的库函数在目标图纸文档中可用?我希望这个库可以在我所有的工作表中使用


我知道使用Sheets插件可以做到这一点,例如,Google的
Date Add Subtract
插件添加了两个新的单元格函数。但是,我不想为了得到相同的结果而发布附加组件。

是的,你可以-但是其中有一些诡计。另外,我没有考虑源脚本和导入的库以不同的作用域为目标的场景。请注意,自定义功能的功能非常有限,无法访问许多高级服务

对于自定义函数,您只能以全局范围为目标。此外,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”对象指向函数本身(点左边的变量)

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


有趣的解决方案,谢谢。为什么一个插件可以添加可以直接调用的函数,而脚本却不能?是否归结为不同的权限?@rkp333不确定直接调用函数是什么意思。您提到的插件不依赖任何外部库。如果检查代码,它由2个*.gs文件组成,这两个文件都在全局范围内。与Node.js不同,Node.js中的每个文件都是一个单独的模块,GAS中的命名空间在单个项目中的文件之间共享。因为所有内容都在全局范围内,所以您可以轻松地从电子表格单元格引用日期函数。附加组件基本上只是独立的脚本,用于分发。@ RKP333也,如果解决方案对你有用,请考虑将问题标记为已解决。谢谢我想我希望导入一个备用脚本使其成为项目的一部分,其功能成为导入工作表的全局范围的一部分,就像添加一个插件一样。但事实并非如此。这是迄今为止我找到的最好的解决方案。
return this[lib][func].apply(this, params);