gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:36:49 29 4
gpt4 key购买 nike

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

在我的新应用中,我有一个员工数据源,其中包含与最初通过 Directory API 填充的评估本身的关系。阅读文档 here ,似乎我应该能够在用户资源上设置监视以查找用户更新并解析它们以在我的员工数据源中进行适当的名称和经理更改。但是,我无法弄清楚监视请求的接收 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);
}

Address 是当前的网络应用 URL。

编辑添加更多:自 2014 年 9 月以来,使用 GAS 接收网络 Hook 的(不)能力一直是一个活跃的问题/功能请求——https://issuetracker.google.com/issues/36761910 -- @dimu-designs 已经有一段时间了。

最佳答案

这是一个更全面的答案。

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

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


第 1 步 - 将独立脚本部署为 Web 应用程序

让我们从以下模板脚本开始,并从 Apps Script Editor 菜单 Publish > Deploy As Web App 将其部署为 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 步 - 验证/验证域所有权并添加/注册域

NOTE: As of August 2019, GAS Web App URLs can no longer be verified using this method. Google Cloud Functions may be a viable alternative.

部署网络应用后,您现在必须验证并注册接收 URL 的域,在本例中也是网络应用 URL。该网址采用以下形式:

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

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

从 Apps 脚本编辑器菜单中选择 发布 > 在 Chrome 网上应用店中注册。向 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");

}

请记住一个警告。更新事件的推送通知仅告诉您用户的数据已更新,它不会告诉您确切的更改内容。但这是另一个问题的问题。

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

关于google-apps-script - 是否可以从 Google App Maker/Google Apps Script 观看 Directory API 更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51966939/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com