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の回答へのコメントに書いたように、解決策は、最初のパラメーターが動的関数名で、2番目のパラメーターから始まる「静的」ディスパッチャー関数を動的関数のパラメーターとして使用することです。=callFunction("pow2", 3)スプレッドシートでは、またはのようになります=callFunction("mul", 3, 1)

しかし、別の問題があります。GAS の内部では、スクリプト関数を呼び出すたびにスクリプトがインスタンス化されているようです。つまり、関数で作成された動的関数onOpenは、他の関数では表示されません。次のコードはそれを示しています。を含むセルには、エラー テキスト=pow2static(3)が含まれます。error: ReferenceError: "pow2" is not defined. (line XX)

回避策は、関数内の動的関数のソース コードをダウンロードし、onOpenそれを中間ストレージ ( CacheまたはScriptDBCacheまたは+の組み合わせのいずれか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 に答える