是否可以从 Google App Maker/Google Apps Script 观看 Directory API 更改?

Lyn*_*man 3 google-apps-script google-app-maker

我正在 Google App Maker 中开发一个性能评估应用程序。我们当前工具面临的挑战之一是,当一个人的经理发生变化或一个人更名时,它不会与我们的 G Suite 目录同步——他们现有的评估与该人的旧姓名相关联,我们有手动更改。

在我的新应用程序中,我有一个员工数据源,其中包含与最初通过目录 API 填充的评估本身的关系。阅读此处的文档,似乎我应该能够在用户资源上设置监视以查找用户更新并解析它们以在我的员工数据源中进行适当的名称和经理更改。但是,我无法弄清楚监视请求的接收 URL 应该是什么。

如果有人在 Google App Maker 中成功完成了此操作,甚至仅在 Google Apps 脚本中完成了此操作,我很想知道您是如何做到的。

编辑添加:

我创建了一个愚蠢的小 GAS 测试函数,看看我是否可以让下面的 @dimu-designs 解决方案起作用。不幸的是,我只是收到一个错误请求错误。这是我所拥有的:

function setUserWatch() {
  var optionalArgs = {
    "event": "update"
  };

  var resource = {
    "id": "10ff4786-4363-4681-abc8-28166022425b",
    "type": "web_hook",
    "address": "https://script.google.com/a/.../...hXlw/exec"
  };
  AdminDirectory.Users.watch(resource);
}
Run Code Online (Sandbox Code Playgroud)

地址是当前的 Web 应用程序 URL。

编辑补充:整个(中)能够用气接收网络挂接已自2014年9月的活跃问题/功能要求- https://issuetracker.google.com/issues/36761910 -这一直@dimu - 设计在上面一段时间。

Dim*_*gns 6

这是一个更全面的答案。

Google 支持跨其许多 API 的推送通知。然而,它们之间存在许多细微(而不是那么细微)的差异。一些利用 webhooks 的主要将其数据负载作为 HTTP 标头发送;例如 Drive API 和 Calendar API。其他人在 HTTP 标头和 POST 正文(例如:AdminDirectory API)中混合了他们的有效负载。它变得更加疯狂,一些 API 完全使用不同的机制(例如:GMail API 利用 Cloud PubSub)。

每个都有细微差别,但您的目标是在 GAS 应用程序中利用 AdminDirectory 推送通知。为此,您需要一个 GAS Web 应用程序,其 URL 可以用作 Web 挂钩端点。


第 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");
}
Run Code Online (Sandbox Code Playgroud)

第 2 步 - 验证/验证域所有权和添加/注册域

注意: 自 2019 年 8 月起,无法再使用此方法验证 GAS Web App URL。Google Cloud Functions 可能是一个可行的 替代方案

部署 Web 应用程序后,您现在必须验证并注册接收 url 的域,在这种情况下,它也是 Web 应用程序 url。此网址采用以下形式:

https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/exec

从技术上讲,您不能拥有 GAS 网络应用程序 url 的域。幸运的是,Google 的 App Script Gods 确实提供了一种机制来验证和注册 GAS 网络应用程序 url。

从 Apps 脚本编辑器菜单中选择Publish > Register in Chrome Web Store。向 Chrome 网上应用店注册已发布的网络应用程序也会验证 URL 的域(无需摆弄搜索控制台)。

验证后,您需要通过 API 控制台中的域验证页面添加“域”。“域”是 url 中不包含“exec”的所有内容,因此您将添加一个如下所示的字符串:

https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/


第 3 步 - 提出观看请求

对于此步骤,应为您的 App 脚本项目和 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
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

请注意,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");

}
Run Code Online (Sandbox Code Playgroud)

有一个警告要记住。更新事件的推送通知只会告诉您用户的数据已更新,它不会告诉您具体更改了什么。但这是另一个问题的问题。

请注意,我遗漏了大量细节,但这应该足以让您启动并运行。