这是一个更全面的答案。
Google 支持跨其许多 API 的推送通知。然而,它们之间存在许多微妙(而不是那么微妙)的差异。一些利用 webhook 的工具主要将其数据负载作为 HTTP 标头发送;例如 Drive API 和 Calendar API。其他人将他们的有效负载混合在 HTTP 标头和 POST 正文中(例如:AdminDirectory API)。而且它变得更加疯狂,一些 API 完全利用了不同的机制(例如:GMail API 利用 Cloud PubSub)。
每个都有细微差别,但您的目标是在 GAS 应用程序中利用 AdminDirectory 推送通知。为此,您需要一个 GAS Web 应用程序,其 URL 可以用作 web-hook 端点。
第 1 步 - 将独立脚本部署为 Web 应用程序
让我们从以下模板脚本开始,并从 Apps Script Editor 菜单将其部署为 Web App Publish > Deploy As Web App:
/** HTTP GET request handler */
function doGet(e) {
return ContentService.createTextOutput("GET message");
}
/** HTTP POST request handler */
function doPost(e) {
return ContentService.createTextOutput("POST message");
}
第 2 步 - 验证/验证域所有权并添加/注册域
注意: 自 2019 年 8 月起,无法再使用此方法验证 GAS Web 应用 URL。 Google Cloud Functions 可能是可行的
替代。
部署了网络应用程序后,您现在必须验证并注册接收 URL 的域,在本例中也是网络应用程序 URL。该网址采用以下形式:
https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/exec
从技术上讲,您不能拥有 GAS Web 应用程序 URL 的域。值得庆幸的是,Google 的 App Script Gods 确实提供了一种机制来验证和注册 GAS Web 应用程序的 URL。
从 Apps 脚本编辑器菜单中选择 Publish > Register in Chrome Web Store。向 Chrome 网上应用店注册已发布的网络应用程序也会验证 URL 的域(无需摆弄搜索控制台)。
验证后您需要add the "domain" via the Domain verification page in the API Console。 “域”是 url 中没有“exec”的所有内容,因此您将添加一个如下所示的字符串:
https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
第 3 步 - 提出观看请求
对于此步骤,应为您的应用脚本项目和 API 控制台启用 AdminSDK/Directory API 服务。
创建一个生成监视请求的函数(这可以针对其他事件类型进行重组):
function startUpdateWatch() {
var channel = AdminDirectory.newChannel(),
receivingURL = "https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/exec",
gSuiteDomain = "[business-name].com",
event = "update";
channel.id = Utilities.getUuid();
channel.type = "web_hook";
channel.address = receivingURL + "?domain=" + gSuiteDomain + "&event=" + event;
channel.expiration = Date.now() + 21600000; // max of 6 hours in the future; Note: watch must be renew before expiration to keep sending notifications
AdminDirectory.Users.watch(
channel,
{
"domain":gSuiteDomain,
"event":event
}
);
}
请注意,Directory API 推送通知有一个过期时间,最长为开始监视后的 6 小时,因此必须定期更新它以确保将通知发送到端点 URL。通常,您可以使用基于时间的触发器每 5 小时左右调用一次此函数。
第 4 步 - 更新 doPost(e) 触发器以处理传入通知
与其他 API 的推送机制不同,Directory API 会在发送通知的同时发送一个 POST 正文,因此可以保证在发送通知时触发 doPost(e) 方法。定制 doPost(e) 触发器以处理传入事件并重新部署 Web 应用程序:
function doPost(e) {
switch(e.parameter.event) {
case "update":
// do update stuff
break;
case "add":
break;
case "delete":
break;
}
return ContentService.createTextOutput("POST message");
}
请记住一个警告。更新事件的推送通知仅告诉您用户的数据已更新,它不会告诉您确切的更改内容。但这是另一个问题的问题。
请注意,我遗漏了很多细节,但这应该足以让您启动并运行。