Google App Script动态定义自定义功能

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"是一个函数名称)
  • 得到错误"#NAME" - 未定义的函数

meg*_*024 5

GAS 不支持来自电子表格的动态函数调用。正如我在对@Srik 答案的评论中所写的那样,一个解决方案是使用“静态”调度程序函数,它的第一个参数是动态函数名称,从第二个参数开始是动态函数的参数。在电子表格中,它看起来像=callFunction("pow2", 3)=callFunction("mul", 3, 1)

但还有一个问题。似乎 GAS 内部在每次调用脚本函数时都会实例化脚本,这意味着在函数中创建的动态函数在其他onOpen函数中将不可见。下面的代码演示了它。=pow2static(3)包含 的单元格包含error: ReferenceError: "pow2" is not defined. (line XX)错误文本。

一种解决方法是下载函数中的动态函数源代码onOpen,将其存储在中间存储中 - CacheScriptDB或更好的组合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)