pix*_*ixx 5 dynamically-generated google-apps-script
如何从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)
}
}
Run Code Online (Sandbox Code Playgroud)
=pow2()从任何单元格调用("pow2"是一个函数名称)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);
}
Run Code Online (Sandbox Code Playgroud)