7

如何从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”是函数名)
  • 得到一个错误“#NAME” - 未定义的函数
4

2 回答 2

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);
}
于 2012-10-17T10:33:10.460 回答
0

您根本不需要 onOpen 。只需编写您的 pow2() 函数并从任何电子表格中调用它

=pow2()

无论如何,每次重新打开电子表格时都会重新计算公式。你的 pow2 函数看起来像

function pow2(val){
  var ret = parseInt(val) * parseInt(val); 
  return ret;
}
于 2012-10-17T09:57:07.947 回答