You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

会议插件开发:如何通过OAuth回调触发Google Calendar相关操作

解决方案

1. 调整authCallback逻辑,不要在授权回调中处理会议生成

createConference的返回值是唯一能让Google Calendar前端识别会议数据的入口,你在回调中单独调用dataBuilder.build()没有绑定上下文,不会被Calendar接收,完全无效。
authCallback只需要完成OAuth2凭据存储,同时添加通知父窗口授权完成的逻辑即可,示例代码:

function authCallback(request) {
  const oauth2Service = getOAuth2Service(); // 你自己定义的OAuth2实例获取方法
  const isAuthSuccess = oauth2Service.handleCallback(request);
  
  if (isAuthSuccess) {
    return HtmlService.createHtmlOutput(`
      <p>授权成功!窗口即将关闭</p>
      <script>
        // 通知父页面授权完成,自动关闭当前窗口
        window.opener.postMessage({ action: 'CALENDAR_CONFERENCE_AUTH_SUCCESS' }, '*');
        setTimeout(() => window.close(), 1000);
      </script>
    `);
  }
  return HtmlService.createHtmlOutput('<p>授权失败,请关闭窗口后重试</p>');
}

2. 确保createConference逻辑正确

createConference只需要在每次被调用时先校验授权状态,未授权就抛出带跳转链接的AUTH错误,已授权就直接返回生成好的ConferenceData对象即可,Google Calendar前端会自动处理后续的展示逻辑:

function createConference(e) {
  const oauth2Service = getOAuth2Service();
  // 校验授权状态
  if (!oauth2Service.hasAccess()) {
    const authUrl = oauth2Service.getAuthorizationUrl();
    throw ConferenceDataService.newConferenceError()
      .setConferenceErrorType(ConferenceDataService.ConferenceErrorType.AUTHENTICATION)
      .setAuthenticationUrl(authUrl)
      .build();
  }
  // 已授权的情况,正常生成第三方会议数据
  const conferenceData = create3rdPartyConference(e); // 你自己的会议生成逻辑,返回databuilder.build()的结果
  return conferenceData;
}

3. 流程说明

  • 用户第一次触发添加会议时,createConference检测到未授权,抛出AUTH错误,Calendar前端自动展示登录按钮
  • 用户点击按钮完成授权,回调页面通知父窗口后自动关闭
  • 此时Calendar前端会自动重试调用createConference,你服务端已经存储了有效token,直接返回会议数据,前端自动替换登录按钮为会议入口,不需要你主动修改未创建的事件,此时传入的eventId为临时ID,调用Calendar API查询自然会返回404,不需要处理这个情况
  • 等用户点击保存事件时,Calendar会自动把会议数据和事件绑定存储,此时eventId才会正式生效。

内容的提问来源于stack exchange,提问作者Olamilekan Ibrahim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:06:01