【问题标题】:How to use a google apps script in multiple documents如何在多个文档中使用 Google Apps 脚本
【发布时间】:2014-09-17 14:02:45
【问题描述】:

我有一个要在多个文档中使用的 google 应用程序脚本。我可能还想稍后在这些文档中更改它,因此我必须在所有这些文档中使用 same 脚本,而不是该脚本的副本。

我知道下面的问题可能被视为重复,但我不愿意接受它的答案。

Google Apps Script - How To Have One Script In multiple containers?

所以,我的问题是:真的没有办法在多个谷歌文档之间共享一个脚本吗?您真的必须为每个文档创建一个新的脚本项目并从其他文档复制并粘贴代码吗?此外,如果您修复其中一个错误,您是否必须记住哪些文档使用该脚本并在每个文档中打开脚本编辑器并复制并粘贴新代码?

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    库是专门为这种情况设计的...请查看documentation here

    【讨论】:

    • 这有点用,因为它解决了我的第二个问题(即你如何传播错误修复),但据我所知,这并不能解决它,因为你必须选择库的特定版本,因此如果您更新了库,您仍然必须遍历每个文件并选择新版本。这可能比复制和粘贴更不容易出错,但仍然容易遗漏(即忘记更新所有文档)。解决方案可能是创建一个很少更改的包装库,但是,您必须再次跳圈才能解决一个简单的问题...
    • 另外,库并不能解决第一个问题:必须为每个文档创建一个新的脚本项目并复制粘贴代码(它们实际上使事情变得更困难,因为您必须包含一个库 和复制粘贴一些使用该库的代码,尽管允许一些更容易的可维护性)。
    • 注意,可以使用“开发模式”,无需更改版本,使用最新保存的版本。关于您的其他问题,理想的情况是使用包含的必要“骨架”创建每个文档,该“骨架”从一开始就调用库(使用模板)。如果您的文档已经存在,那么确实会有点乏味。
    • 现在我看到如果接收者对库具有编辑权限,则在库的最新版本之后有一个“开发者模式”选项,所以我的第一个问题似乎不那么严重。尽管如此,必须授予写访问权限以便用户能够获得最新的更改有点有趣。
    • 我发现使用库不适用于最有用的情况,例如创建侧边栏的 onOpen 函数。发生的情况是 HTML 服务调用的函数未正确解析到库本身的范围内,从而导致“未找到函数”错误。我什至尝试通过完全限定函数调用来绕过它,但这也不起作用。
    【解决方案2】:

    我想出了一个适合我的解决方案。它允许将任意数量的脚本附加到某种主文档(我们称之为 MyScripts)。无需库,无需发布。

    创建一个文档并将其命名为 MyScripts(或其他)。文档的正文可以是空的,或者您可以在那里写一些说明。然后,将以下代码粘贴到 MyScript 的脚本编辑器中:

    // adds a menu to the master document's UI
    function onOpen() {
      DocumentApp.getUi()
                 .createAddonMenu()
                 .addItem('Do something', 'doSomething')
                 .addItem('Something else', 'somethingElse')
                 .addToUi()
    }
    
    // returns the target document based on its URL
    // may be tweaked in order to use the documentId instead
    function findDoc(prompt) {
      var ui = DocumentApp.getUi();
      var pro = ui.prompt(prompt, 'Document URL:', ui.ButtonSet.OK);
      var url = pro.getResponseText();
      return DocumentApp.openByUrl(url);
    }
    
    function doSomething() {
      var doc = findDoc('Do something');
      if (doc) {
        // do something with the target document
        var len = doc.getBody().getText().length;
        DocumentApp.getUi().alert('The document is ' + len + ' characters long')
      }
    }
    
    function somethingElse() {
      var doc = findDoc('Something else');
      if (doc) {
        // do something else
      }
    }
    

    onOpen() 函数应该是不言自明的。

    findDoc() 是真正的黑客。它提示用户输入目标文档的 URL,即我们要操作的文档。如果 URL 有效,则findDoc() 返回相应的文档对象。

    最后两个函数只是存根,应该用您自己的代码替换,但请注意在每个函数的开头如何调用findDoc()

    当您想对文档运行脚本时,复制其 URL,然后打开 MyScripts,选择相应的附加组件菜单项,粘贴 URL 并单击确定。

    请注意,当您第一次尝试以这种方式运行脚本时,您会收到一条可怕的警告消息。在忽略警告并执行脚本之前,请确保您的 doSomething()somethingElse() 等仅包含安全代码。

    【讨论】:

    • 另一种方法是编写一个使用 Google Drive 文件选择器的 web 应用程序:developers.google.com/apps-script/guides/…
    • 嘿,听起来对我来说也是一个很好的解决方案。将此转换为 SpreadsheetApp 我在第 13 行得到错误“未定义 ui”.prompt(pros, 'URL:', ui.ButtonSet.OK);是否应该对此进行调整以以某种方式与电子表格一起使用?
    • JJxyz,这是 @user3264007 指出的错误。现在应该修复了
    • Tks。但是,此方法仅允许您针对特定文档运行宏。如果我们想在特定文件中调用主脚本文件中的函数怎么办?
    【解决方案3】:

    自 2020 年 9 月 6 日起,使用库意味着创建一个项目以添加对库的引用和一些代码以使库函数可用于容器文档。让脚本在多个文档上可用且无需在其上创建脚本且不受限制的唯一方法是创建 G Suite 编辑器插件

    自 2019 年 12 月起,所有 G Suite 编辑器插件都已发布到 G Suite Marketplace。您可以将插件设为不公开,只有拥有 G Suite 帐户的用户才能发布插件,限制为同一域中的其他用户可见。

    作为插件测试

    如果您不想发布和加载项,您可以使用运行 > 测试作为加载项,但有一些限制。 IE。以下不能用于此模式:

    • 触发器
    • 自定义函数

    主项目

    正如Giussepes' answer 所建议的那样,使用“主项目”来保存您的脚本。这也有几个限制

    • 大部分活动方法都无法使用
    • 无法使用简单触发器,但可以通过编程方式创建可安装触发器
    • 自定义函数仅适用于电子表格插件和绑定到将使用自定义函数的电子表格的脚本

    辞职

    如果您已辞职以在每个文档上都有一个项目,您可以通过使用 CLASP 或Goole Apps Script Assistant for GitHub来减轻保持脚本更新的负担

    资源

    【讨论】:

      【解决方案4】:

      抱歉,我的声誉太低,无法添加评论。 :( 在 Giuseppe 的回答中,使用它来查找文档 - 小改动

      function findDoc(pros) {
        var ui =  DocumentApp.getUi();
        var pro = ui.prompt(pros, 'URL:', ui.ButtonSet.OK);
        var url = pro.getResponseText();
        return DocumentApp.openByUrl(url);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多