如何在谷歌工作区插件中使用 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接口测试工具:在谷歌浏览器安装插件方法以及使用说明

在谷歌地图上绘制区域

如何在谷歌浏览器中设置兼容性视图

如何在谷歌浏览器增加插件

在 Gmail 插件中使用 UrlFetchApp 的权限错误

如何在 Google Apps 脚本中使用 UrlFetchApp 发出 Drive API 批处理请求