如何从onOpen()
功能代码动态定义电子表格的自定义功能?
function onOpen() {
//var s = SoapService.wsdl("http://example.com/service.wsdl", "serv");
//var funcs = s.getServerFunctions();
var funcs = { "pow2": "function (v) { return v*v};" }
for(var f in funcs)
{
this[f] = eval(funcs[f]) // define server functions as custom google-script functions for spreadsheet using this[function_name] = eval(function_code)
}
}
=pow2()
(“pow2”是函数名称)答案 0 :(得分:4)
GAS不支持电子表格中的动态函数调用。正如我在对@Srik答案的评论中所写,解决方案是使用“静态”调度函数,其具有第一个参数的动态函数名称,从第二个参数开始是动态函数的参数。在电子表格中,它看起来像=callFunction("pow2", 3)
或=callFunction("mul", 3, 1)
。
但还有另一个问题。似乎GAS内部每次调用脚本函数都会对脚本进行实例化,这意味着在onOpen
函数中创建的动态函数将在其他函数中不可见。以下代码演示了它。包含=pow2static(3)
的单元格包含error: ReferenceError: "pow2" is not defined. (line XX)
错误文本。
解决方法是在onOpen
函数中下载动态函数源代码,将其存储在中间存储中 - Cache或ScriptDB或更好的组合Cache
+ ScriptDB
,按照中间存储中的名称搜索代码,并在“静态”调度函数内执行。
function onOpen() {
var funcs = { "pow2": "function (v) { return v*v};" }
for(var f in funcs) {
this[f] = eval(funcs[f]);
}
}
function pow2static(val) {
return pow2(val);
}
答案 1 :(得分:0)
根本不需要onOpen。只需编写pow2()函数并从任何电子表格中调用它
=pow2()
每次重新打开电子表格时,都会重新计算公式。您的pow2功能看起来像
function pow2(val){
var ret = parseInt(val) * parseInt(val);
return ret;
}