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

Google Sheets Apps Script:客户端调用时ID Token无法生成的问题与解决

Google Apps Script侧边栏调用无法生成ID Token的问题解析与解决

问题1:为何编辑器调用能生成ID Token,客户端侧边栏调用不行?

这是因为ScriptApp.getIdentityToken()的运行授权上下文存在差异:

  • 在Apps Script编辑器直接运行函数时,脚本处于完全授权的服务器端上下文,以当前登录用户身份拥有完整OAuth权限,能正常生成有效ID Token。
  • 通过侧边栏(HTML客户端)调用服务器端函数时,属于客户端触发的有限授权上下文。默认情况下,这种跨上下文调用的权限范围不包含获取用户身份令牌的权限,因此ScriptApp.getIdentityToken()会返回空值,导致Cloud Function因缺少有效令牌返回"Authorization is required to perform that action."错误。

问题2:如何通过侧边栏调用生成ID Token并传递给Cloud Function?

可以通过调整OAuth权限配置、优化函数逻辑解决,具体步骤如下:

1. 配置必要的OAuth权限范围

  • 打开Apps Script编辑器,进入项目设置,勾选「显示"appsscript.json"清单文件」。
  • 打开appsscript.json文件,更新oauthScopes字段,添加至少两个必要范围:
    "oauthScopes": [
      "https://www.googleapis.com/auth/script.external_request",
      "https://www.googleapis.com/auth/userinfo.email"
    ]
    
    这两个范围分别允许脚本发起外部HTTP请求、获取用户邮箱身份信息,为生成ID Token提供权限基础。

2. 优化服务器端函数逻辑

在sendPayloadToCloudFunction函数中,添加ID Token有效性检查,并确保请求携带令牌:

function sendPayloadToCloudFunction(urlRange, xpathRange, outputCell) {
  // 生成身份令牌
  var idToken = ScriptApp.getIdentityToken();
  
  // 检查令牌是否有效,无效则抛出提示
  if (!idToken) {
    throw new Error("未获取到身份令牌,请先在编辑器中手动运行一次该函数完成授权");
  }

  // 构造请求参数,携带ID Token到Cloud Function
  var requestOptions = {
    method: "POST",
    headers: {
      "Authorization": "Bearer " + idToken,
      "Content-Type": "application/json"
    },
    payload: JSON.stringify({
      urlRange: urlRange,
      xpathRange: xpathRange,
      outputCell: outputCell
    })
  };

  // 调用Cloud Function
  var response = UrlFetchApp.fetch("你的Cloud Function地址", requestOptions);
  return response.getContentText();
}

3. 客户端侧边栏添加错误处理

在侧边栏的JS代码中,通过google.script.run的错误处理函数捕获授权问题,提示用户操作:

function sendPayload() {
  // 获取用户输入的参数
  var urlRange = document.getElementById("urlRange").value;
  var xpathRange = document.getElementById("xpathRange").value;
  var outputCell = document.getElementById("outputCell").value;

  // 调用服务器端函数
  google.script.run
    .withSuccessHandler(function(result) {
      alert("请求已成功发送");
    })
    .withFailureHandler(function(error) {
      alert("出错:" + error.message);
    })
    .sendPayloadToCloudFunction(urlRange, xpathRange, outputCell);
}

4. 完成首次授权引导

修改配置后,先在Apps Script编辑器中手动运行一次sendPayloadToCloudFunction函数(可临时传入测试参数),触发OAuth授权流程,让用户完成权限确认。之后侧边栏的调用就能正常获取ID Token了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:02:42