如何在谷歌工作区插件中使用 UrlFetchApp.fetchAll 和日历 API
Posted
技术标签:
【中文标题】如何在谷歌工作区插件中使用 UrlFetchApp.fetchAll 和日历 API【英文标题】:How to use UrlFetchApp.fetchAll with Calendar API in google workspace addon 【发布时间】:2022-01-07 23:16:27 【问题描述】:我们的 Google Workspace 插件将日历事件从 Google 日历同步到外部数据库。
作为此过程的一部分,我们使用 patch 命令更新多个日历事件
Calendar.Events.patch(extendedProperties:pp,_e.calendar.calendarId,_e.calendar.id);
我们遇到的问题是我们需要在有限的时间内多次执行这个操作(app脚本会超时)
我们可以使用 UrlFetchApp.fetchAll 函数来实现这一点,但不幸的是,要调用它,我们需要直接调用日历 api。虽然这很容易完成 - 我们没有 AccessToken,因为它不可用并且由 API 处理。
有谁知道如何获取日历 API 正在使用的 accessToken(无需通过单独的 OAuth 批准流程),以便我们可以利用它来调用 UrlFetchApp.fetchAll
【问题讨论】:
虽然我不确定我是否能正确理解你的情况,例如关于without pushing the user through a separate OAuth approval process
,你可以在你的情况下使用服务帐号吗?
除了@Tanaike 提到的,您还有哪种类型的帐户,消费者或工作区?
我认为您应该能够在云控制台中启用 api 并将其添加到您的项目中。
嗨@Tanaike,我们在工作区插件中没有accessToken,这一切都由谷歌无缝管理。然而,我们可以单独请求日历 api 的权限,但这需要我们让每个用户通过 OAuth 2 访问过程授予访问权限。我们不想这样做。同样,我们可以使用服务帐户,但这需要某种形式的单独授权。
@JoseVasquez 两种帐户类型都受支持。
【参考方案1】:
只要您的插件中有正确的日历范围,我认为您可以将ScriptApp.getOauthToken()
作为UrlFetchApp
请求中的令牌传递:
getOAuthToken()
获取有效用户的 OAuth 2.0 access token。如果脚本的 OAuth 范围足以授权另一个通常需要自己的 OAuth 流的 Google API(如Google Picker),则脚本可以通过传递此令牌来绕过第二个授权提示。令牌会在一段时间后过期(至少几分钟);脚本应处理授权失败并在需要时调用此方法以获取新令牌。
此方法返回的令牌仅包含脚本当前需要的范围。先前已授权但脚本不再使用的范围不包含在返回的令牌中。如果除了脚本本身需要之外还需要其他 OAuth 范围,它们可以是脚本清单文件中的 specified。
返回
String
— OAuth 2.0 令牌的字符串表示形式。
示例请求:
function patchCalendarEvents()
const calendarId = "calendarId"
const eventIds = [] // your event ID list
const baseUrl = `https://www.googleapis.com/calendar/v3/calendars/$calendarId/events/eventId`
const requests = []
eventIds.forEach(function (event)
requests.push(
"url": baseUrl.replace("eventId", event),
"method": "PATCH",
"headers":
"Authorization": "Bearer " + ScriptApp.getOAuthToken()
,
"payload": '"extendedProperties": "shared": "testKey": "Test Value"',
"contentType": "application/json",
)
)
console.log(requests)
const responses = UrlFetchApp.fetchAll(requests)
responses.forEach(function(response)
console.log(response.getContentText())
)
【讨论】:
以上是关于如何在谷歌工作区插件中使用 UrlFetchApp.fetchAll 和日历 API的主要内容,如果未能解决你的问题,请参考以下文章
Postman接口测试工具:在谷歌浏览器安装插件方法以及使用说明