【问题标题】:Can I trigger a Google Script when a file is saved to Google Drive?当文件保存到 Google Drive 时,我可以触发 Google 脚本吗?
【发布时间】:2016-07-07 10:02:50
【问题描述】:
我有一个 VBA 脚本,可以将 Excel 文件转换为 PDF,然后通过 Google Drive 桌面同步将其保存到 Google Drive 文件夹中。
然后我想做的是让 Google 脚本触发器监视给定的文件夹,并且每次将文件保存在那里时,它都会运行一个脚本以通过电子邮件发送文件。我在基于时间的触发器上运行时脚本运行良好,每 15 分钟一次,但更喜欢实时解决方案。
所以我喜欢 onChange() 触发器,但用于 Google Drive。
可能吗?
谢谢
【问题讨论】:
标签:
google-apps-script
triggers
【解决方案1】:
这应该可以通过 Google Drive 的 Push Notifications API 实现。详情请见this link。
推送通知
本文档描述了如何使用推送通知在资源更改时通知您的应用程序。
概述
Drive API 提供推送通知,让您可以监视资源的变化。您可以使用此功能来提高应用程序的性能。它允许您消除轮询资源所涉及的额外网络和计算成本,以确定它们是否已更改。每当监视的资源发生变化时,Drive API 都会通知您的应用程序。
要使用推送通知,您需要做两件事:
- 设置您的接收 URL,或“Webhook”回调接收器。
- 这是一个 HTTPS 服务器,用于处理资源更改时触发的 API 通知消息。
- 为您要观看的每个资源端点设置通知通道。
通道指定通知消息的路由信息。作为通道设置的一部分,您确定要接收通知的特定 URL。每当频道的资源发生变化时,Drive API 都会将通知消息作为 POST 请求发送到该 URL。
目前,Drive API 支持文件和更改资源更改的通知。
【解决方案2】:
目前,GAS 无法实现这种脚本触发器。您必须运行一个持续检查的基于时间的脚本。
【解决方案3】:
我找到了这个blog,并进行了一些修改,它对我有用:
function setupTrigger(){
let oneMinuteAgo = new Date(new Date().getTime() - 1 * 60 * 1000).toISOString();
let files = DriveApp.searchFiles('("1w0P5s5-BAlWB1EIr124h3wFPha_q6BPt" in parents) and (modifiedDate > "' + oneMinuteAgo + '")');
while (files.hasNext()){
let file = files.next();
}
}
其中 1w0P5s5-BAlWB1EIr124h3wFPha_q6BPt 是我上传文件的文件夹 ID。请注意,modifiedDate 表示文件的修改日期(因此,如果您在一天前创建文件,那么 modifiedDate 将表示一天前,而不是上传日期)。