分发特定(有界)脚本的最简单方法确实是创建一个包含脚本的模板电子表格。如果您的脚本更通用并且任何人都可以使用,那么 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 函数检查 ScriptProperty(您可以轻松地手动更改而无需更新版本)并通知您的用户他们需要更新他们的脚本(即进入脚本编辑器并更新库版本)。
在导入库时可以设置 开发模式 标志,从而避免进入并更新库版本的需要。但它仅在运行脚本的用户是导入库的开发人员时才有效。也就是说,如果您有自己以外的用户,则必须与他们共享您的库,以授予编辑权限。如果这一切都在您的域下或在朋友之间,这对您来说可能是可以接受的。但这并不是一个确定的解决方案。
另一种可能的解决方法是使用eval,个人不太喜欢,但可能对您有用。您可以将“逻辑”代码保存在 Google 文档或其他地方,然后在脚本上获取它,然后 eval 它来运行您的函数。您仍然需要在每个脚本上使用一些样板代码,但您的用户无需执行任何操作即可获取更新的代码。您还需要将存根调用添加到您在分布式脚本中的 Apps 脚本中使用的所有服务,以便它提示用户获得所有所需的授权。
最后,Apps Script issue tracker 上打开的some issues 以某种方式与此相关。您应该给他们“加注星标”以接收更新并为他们投票。我有专门的opened one。