【问题标题】:Can you use functions from an imported standalone script as cell formula custom functions?您可以将导入的独立脚本中的函数用作单元格公式自定义函数吗?
【发布时间】:2018-10-23 15:29:47
【问题描述】:

我已将具有基本库函数的独立 Google App 脚本项目(称为SheetUtilities)导入另一个 Google 表格文档(SheetTest)。我想将SheetUtilities 中的函数用作SheetTest 单元格公式中的自定义函数。

我可以成功调用SheetTest中脚本编辑器中的函数例如:

function wrapperfunc(){
  SheetUtilities.foo();
}

但是,如果进入一个单元格并调用 =foo()=SheetUtilities.foo() 我会收到 #NAME? 错误。如何使这些导入的库函数在目标工作表文档中可用?我希望这个库可以在我的所有工作表中使用。

我知道使用表格插件可以做到这一点,例如来自 Google 的 Date Add Subtract 插件添加了几个新的单元格功能。但是我不想发布插件来获得相同的结果。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    是的,你可以 - 但其中涉及一些诡计。另外,我没有考虑源脚本和导入的库针对不同范围的情况。请注意,自定义函数的功能非常有限,不能访问许多高级服务。

    使用自定义函数,您只能定位全局范围。此外,您的 SheetUtilities 对象不是函数,尽管从技术上讲,一切都是 JavaScript 中的对象。

    总而言之,从电子表格单元格中,您似乎只能引用以下“对象”的类型:1)位于全局范围内 2)从 Function.prototype 继承

    我能想到的唯一解决方案是专门为调用库中的嵌套函数而编写函数。作为第一个参数,我们将按以下格式传递字符串

    “LIBNAME.FUNCNAME”

    后跟函数本身的参数列表。

    function CALL_LIB(libDotFunc){
    
      var arr = libDotFunc.split("."); //a string to array with "." as separator
      var lib = arr[0]; //getting library name
      var func = arr[1]; //getting function name
      var args = Array.prototype.slice.call(arguments); //convert arguments object to an array
      var params = args.slice(1); //this will return any other arguments passed to the function
    
      return this[lib][func].apply(this, params);
    
    }
    

    库只是第一个“this”指向的全局对象的属性。反之,嵌套函数是库对象的属性之一。

    this[lib][func] //selecting the function to be executed
    

    最后,我们调用传递所需参数的函数。在这个阶段,我们必须让“this”对象指向函数本身(点左侧的变量)。

    return this[lib][func].apply(this, params);
    

    然后您可以从这样的单元格中调用库函数

    【讨论】:

    • 有趣的解决方案,谢谢。为什么插件可以添加可以直接调用的功能,而脚本却不能呢?是否归结为不同的权限?
    • @rkp333 不知道直接调用函数是什么意思。您提到的插件不依赖任何外部库。 github.com/gsuitedevs/apps-script-samples/tree/master/sheets/… 如果您检查代码,它由 2 个 *.gs 文件组成,这两个文件都在全局范围内。与 Node.js 中每个文件都是一个单独的模块不同,在 GAS 中,命名空间在单个项目中的文件之间共享。因为一切都在全局范围内,您可以轻松地从电子表格单元格中引用 DATE 函数。附加组件基本上只是用于分发的独立脚本。
    • @rkp333 另外,如果解决方案适合您,请考虑将问题标记为已解决。谢谢!
    • 我想我希望导入一个支持脚本使其成为项目的一部分,并且它的功能是导入表的全局范围的一部分,就像添加插件似乎一样。但事实并非如此。
    • 这是迄今为止我找到的最佳解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多