Google apps script Google应用程序脚本动态定义自定义函数
如何从Google apps script Google应用程序脚本动态定义自定义函数,google-apps-script,dynamically-generated,Google Apps Script,Dynamically Generated,如何从onOpen()函数代码动态定义电子表格的自定义函数 写一个代码 函数onOpen(){ //var s=SoapService.wsdl(“http://example.com/service.wsdl“,“serv”); //var funcs=s.getServerFunctions(); var funcs={“pow2”:“函数(v){return v*v};”} for(函数中的变量f) { 此[f]=eval(funcs[f])//使用此[function\u name]
onOpen()
函数代码动态定义电子表格的自定义函数
- 写一个代码
- 尝试从任何单元格调用
(“pow2”是函数名)=pow2()
- 获取错误“#名称”-未定义的函数
- 您根本不需要onOpen。只需编写pow2()函数并从任何电子表格中调用它即可
=pow2()
无论如何,每次重新打开电子表格时都会重新计算公式。您的pow2函数可以如下所示
function pow2(val){
var ret = parseInt(val) * parseInt(val);
return ret;
}
GAS不支持来自电子表格的动态函数调用。正如我在对@Srik答案的评论中所述,解决方案是使用“静态”调度程序函数,该函数具有第一个参数动态函数名,并且从第二个参数开始是动态函数的参数。在电子表格中,它看起来像
=callFunction(“pow2”,3)
或=callFunction(“mul”,3,1)
但还有另一个问题。GAS内部构件似乎在每次调用脚本函数时都会引用脚本,这意味着在onOpen
函数中创建的动态函数在其他函数中不可见。下面的代码演示了它。包含=pow2static(3)
的单元格包含错误:ReferenceError:“pow2”未定义。(第XX行)
错误文本
一种解决方法是下载onOpen
函数中的动态函数源代码,将其存储在中间存储器中,或者最好是组合缓存+ScriptDB
,在中间存储器中按名称搜索代码,并在“静态”调度函数中执行
函数onOpen(){
var funcs={“pow2”:“函数(v){return v*v};”}
for(函数中的变量f){
此[f]=eval(funcs[f]);
}
}
功能功率静态(val){
返回功率2(val);
}
作者的想法“隐藏”在注释行中-//var s=SoapService.wsdl(“http://example.com/service.wsdl“,“serv”)//var funcs=s.getServerFunctions()代码>,即他希望使用SOAP协议动态加载公式。解决方法是使用“静态”函数,该函数具有第一个参数动态函数名称和从第二个参数开始的参数是动态函数的参数。在电子表格中,它看起来像=callFunction(“pow2”,3)
或=callFunction(“mul”,3,1)
谢谢您的回复!看来你是对的。。。这是可悲的。难道你不知道-是否有任何ErrorHandler可以捕获并覆盖“undefined functions”调用?是的,抛出一个包含ReferenceError的实例,标准ReferenceError类的文本中未定义“myFunction”。