在我们的组织中,我们使用 Google 电子表格作为内部应用程序的数据输入。我创建了一个 Google Apps 脚本来促进修改电子表格的过程。
如您所见,此脚本依赖于电子表格格式,并提供仅适用于我们组织的非常特定的用途。
我的问题是如何自动将任何更改推送到正在使用它的所有电子表格实例?
我可以将脚本添加到脚本库,但我认为它不适合这些类型的脚本,而且如果对主副本的任何更改将被推送给客户端,我也找不到信息。
我看到的另一个选项是创建一个包含脚本的电子表格模板,但同样,更改会被推送吗?
在我们的组织中,我们使用 Google 电子表格作为内部应用程序的数据输入。我创建了一个 Google Apps 脚本来促进修改电子表格的过程。
如您所见,此脚本依赖于电子表格格式,并提供仅适用于我们组织的非常特定的用途。
我的问题是如何自动将任何更改推送到正在使用它的所有电子表格实例?
我可以将脚本添加到脚本库,但我认为它不适合这些类型的脚本,而且如果对主副本的任何更改将被推送给客户端,我也找不到信息。
我看到的另一个选项是创建一个包含脚本的电子表格模板,但同样,更改会被推送吗?
分发特定(有界)脚本的最简单方法确实是创建一个包含脚本的模板电子表格。如果您的脚本更通用并且任何人都可以使用,那么 Gallery 是合适的。
现在,没有很好的解决方案可以将更改推送到脚本的副本,无论您如何分发脚本,因为最终每个“安装”都是一个独立的副本,而不是链接到原始副本。
最简单但仍然很麻烦的方法是使用库。您将所有逻辑放在一个库中,并且只将样板文件放在将被复制的脚本中。即onOpen
和onEdit
功能和存根菜单功能。像这样的东西:
function onOpen(e) { return Lib.onOpen(e); }
function onEdit(e) { return Lib.onEdit(e); }
function stub1() { return Lib.stub1(); }
function stub2() { return Lib.stub2(); }
//etc... as many as you need, than a couple more for future growth
这个分布式脚本将导入您的主脚本(Lib
),它将具有所有逻辑。例如
function onOpen(e) {
e.source.addMenu('Custom Menu', [{name:'Do something', functionName:'stub1'}]);
}
function onEdit(e) {
;//something
}
function stub1() {
Browser.msgBox('Example');
}
现在,仍然存在一个问题,当您更新 Lib 时,您或您的用户将不得不进入所有具有脚本的文档的脚本编辑器并手动更新库版本。
您甚至可以做一些花哨的事情,例如让onOpen
函数检查 a ScriptProperty
(您可以轻松地手动更改而无需更新版本)并通知您的用户他们需要更新他们的脚本(即进入脚本编辑器并更新库版本)。
导入库时可以设置开发模式标志,避免需要进入并更新库版本。但它仅在运行脚本的用户是导入库的开发人员时才有效。也就是说,如果您有自己以外的用户,则必须与他们共享您的库,以授予编辑权限。如果这一切都在您的域下或在朋友之间,这对您来说可能是可以接受的。但并不是真正的明确解决方案。
另一种可能的解决方法是使用eval
. 您可以将“逻辑”代码保存在 Google 文档或其他地方,然后在脚本中获取它,然后eval
运行您的函数。您仍然需要在每个脚本上使用一些样板代码,但您的用户无需执行任何操作即可获取更新的代码。您还需要将存根调用添加到您在分布式脚本内的 Apps 脚本中使用的所有服务,以便它提示用户获得所有所需的授权。
最后,在 Apps Script问题跟踪器上打开了一些 与此相关的问题。您应该给他们“加注星标”以接收更新并为他们投票。我刚刚为此专门开了一个。