我创建了一个通知脚本,并希望将其用于多个电子表格(由表单生成)。我希望有一个集中的脚本并在我的多个电子表格上引用它,以简化维护。
我尝试使用如下所示的SpreadsheetApp.openById()
,但出于安全原因,此功能似乎已被禁用,不再受支持。
function append()
{
SpreadsheetApp.openById("1xdePF..........................");
}
知道如何对多个电子表格使用相同的脚本吗?
文档指定openById
使用给定 ID 打开电子表格。
不能使用此方法打开脚本。
要打开应用程序脚本,请转到 https://script.google.com/home/my 并输入您选择的脚本。
对于绑定脚本,打开脚本绑定到的文档并转到Tools->Script Editor
前言
这个答案是对ziganotschka的补充,因为您确实无法通过使用openById()
打开该文档来访问绑定到文档的脚本。相反,答案涵盖了您遇到的其他问题,并提出了解决任务的其他方法。
问题
尝试使用openById()
时,您会收到以下结构的错误消息:
例外:文档 [此处为 doc ID] 丢失(可能已删除,或者您没有读取权限?
您在评论中提到 id 是 58 个字符(我位是 57 个字符)并从"属性"获得,这解释了错误 - 没有带有此类 id 的电子表格,因为您提取的文件id 和脚本 id不是一回事。如果需要以编程方式提取当前id(此处假定是从绑定到电子表格的脚本调用的,但其他服务也有类似的方法),可以调用getActiveSpreadsheet()
->getId()
。
解决 方案
您说你需要一个维护脚本,那么如何创建一个以任何文档可以访问的方式部署的独立脚本项目:
作为图书馆
任何具有已保存版本的脚本都可以是其他脚本可以使用的库,方法是将其 id 添加到可从菜单访问的列表中Resources->Libraries
该库。
作为网络应用程序
任何具有doGet
、doPost
函数(或两者)的脚本都可以部署为 Web 应用程序,实质上是将其暴露给网络。既然您说电子表格是由表单"生成"的,并且您创建了一个"通知"脚本,我假设您对FormSubmit
事件感兴趣。部署为 Web 应用时,会获取一个URL(不要忘记选择适当的权限)。
之后,只需确保:
- 每个表单都有一个可安装的
onFormSubmit
触发器(您可以通过[请参阅文档参考]ScriptApp.newTrigger('callback name').forForm('form ref').onFormSubmit()
来安装它)。 - 触发器的回调通过
UrlFetchApp.fetch()
调用 Web 应用 URL,其中包含必要的数据(如电子表格 ID 或任何其他信息)作为查询(如果使用doGet
)或请求正文(如果使用doPost
)。 - 您需要的数据将在命中到
doGet
或doPost
时构造的事件对象中可用[注意避免常见的误解:您无法在编辑器中调试事件对象,它只能实时完成]。
参考
getActiveSpreadsheet()
文档getId()
文档getFileById()
文档- 独立脚本指南
- 绑定脚本指南
- 图书馆指南
- 表单提交事件参考
new Trigger()
文档UrlFetchApp.fetch()
文档doGet
/doPost
事件对象文档