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

时间:2012-10-17 07:29:09

标签: google-apps-script dynamically-generated

如何从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” - 未定义的功能

2 个答案:

答案 0 :(得分:4)

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);
}

答案 1 :(得分:0)

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

=pow2()

每次重新打开电子表格时,都会重新计算公式。您的pow2功能看起来像

function pow2(val){
  var ret = parseInt(val) * parseInt(val); 
  return ret;
}