我已将具有基本库功能的独立Google App脚本项目(名为SheetUtilities
)导入另一个Google表单文档(SheetTest
)。我希望将SheetUtilities
中的函数用作SheetTest
中的单元格公式中的自定义函数。
我可以在SheetTest
中的脚本编辑器中成功调用这些函数,例如:
function wrapperfunc(){
SheetUtilities.foo();
}
但是,如果进入单元格并致电=foo()
或=SheetUtilities.foo()
,我会收到#NAME?
错误。如何在目标工作表文档中提供这些导入的库函数?我希望这个库可以在我的所有工作表中使用。
我知道这可以使用Sheets Addons,例如来自Google的Date Add Subtract
add添加了一些新的单元格功能。但是,我不想发布添加以获得相同的结果。
答案 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);
然后,您可以从像这样的单元格中调用库函数