如何在多个文档中使用Google Apps脚本

时间:2014-09-17 14:02:46

标签: google-apps-script

我有一个谷歌应用程序脚本,我想在多个文档中使用。我也可能希望稍后在这些文档中进行更改,因此必须在所有这些文档中使用相同的脚本,而不是该脚本的副本。

我知道以下问题,可能有资格作为副本,但我不愿接受答案。

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

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

4 个答案:

答案 0 :(得分:7)

图书馆专门针对这种情况而设计......请查看documentation here

答案 1 :(得分:2)

我想出了一个适合我的解决方案。它允许保留任意数量的脚本附加到一种主文档(让我们称之为MyScripts)。没有图书馆,不需要出版。

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

// adds a menu to the master document's UI
// the document
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(pros) {
  var pro = DocumentApp.getUi().prompt(pros, '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,选择相应的Add-Ons菜单项,粘贴URL并单击OK。

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

答案 2 :(得分:1)

从2020年9月6日开始,使用库意味着创建一个项目以添加对该库的引用和一些代码以使该库功能可用于容器文档。无需在多个文档上创建脚本且不受限制地在多个文档上提供脚本的唯一方法是创建 G Suite编辑器加载项

自2019年12月起,所有G Suite编辑器附加组件均已发布到G Suite市场。您可以将附件设为不公开,并且只有拥有G Suite帐户的用户才能发布附件,但该附件只能被来自同一域的其他用户看到。

作为附件测试

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

  • 触发器
  • 自定义功能

主项目

根据Giussepes' answer的建议,是使用“主项目”来保存脚本。这也有一些局限性

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

辞职

如果您辞职在每个文档上都有一个项目,则可以减少使用CLASP或Goole Apps Script Assistant for GitHub

来更新脚本的负担。

资源

答案 3 :(得分:0)

对不起,我的声誉太低,无法添加评论。 :( 在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);
}