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

Google Apps Script调用报403权限错误,求解决方法

解决Google Apps Script API调用403权限拒绝问题

核心问题定位

你当前的调用方式混淆了Web App和Apps Script Execution API两种部署/调用模式,同时代码和权限配置存在几个关键问题,导致403错误。

具体修复步骤

1. 调整Apps Script部署为Web App(而非API Executable)

你的代码是doPost函数,这是Web App的专属入口,而非Execution API的函数格式。需要重新部署:

  • 打开Apps Script编辑器,点击右上角「部署」→「新部署」
  • 点击齿轮图标,选择「Web应用」
  • 配置选项:
    • 执行:选择「我」(即使外部调用也以脚本所有者身份执行)
    • 谁可以访问:选择「任何人,甚至匿名」(如果需要限制可改为「组织内任何人」,但要确保服务账号在权限范围内)
  • 点击部署,复制新的Web App URL(注意:每次修改代码后必须重新部署并更新URL)

2. 修改Dart调用代码(适配Web App的POST请求)

当前Dart代码是按照Execution API的格式传参,但Web App的doPost直接接收原始JSON数据,不需要外层的function和parameters结构。修改后的代码:

import 'package:googleapis_auth/auth_io.dart';
import 'dart:convert';
import 'dart:io';

Future<void> sendFeedback(Feedback feedback) async {
  final serviceAccountJson = File('feedback-account.json').readAsStringSync();
  final credentials = ServiceAccountCredentials.fromJson(serviceAccountJson);

  final client = await clientViaServiceAccount(
    credentials,
    [
      'https://www.googleapis.com/auth/drive', // 补充Drive权限,确保服务账号能访问目标表格
      'https://www.googleapis.com/auth/spreadsheets',
    ],
  );

  final url = "你的新Web App部署URL"; // 替换为重新部署后的Web App地址

  // 直接传递反馈数据,无需外层包装
  final bodyJson = jsonEncode({
    'date': getFormattedDate(feedback.date),
    'name': feedback.name,
    'email': feedback.email,
    'rating': feedback.rating,
    'message': feedback.message,
  });

  final response = await client.post(
    Uri.parse(url),
    headers: {'Content-Type': 'application/json'},
    body: bodyJson,
  );

  print('Response: ${response.body}');
}

3. 修正Apps Script中的表格获取逻辑

SpreadsheetApp.getActiveSpreadsheet()依赖脚本绑定的表格上下文,服务账号调用时可能因权限问题无法获取。改为通过表格ID直接打开:

// 替换原有的ss获取代码
const spreadsheetId = "你的Feedback表格ID"; // 从表格URL中提取,例如https://docs.google.com/spreadsheets/d/[ID]/edit
const ss = SpreadsheetApp.openById(spreadsheetId);
const sheet = ss.getSheetByName('Feedback');

4. 更新权限配置

  • 确认服务账号邮箱已被添加到Feedback表格的共享列表,且拥有「编辑」权限
  • 调整appsscript.json的oauthScopes,补充必要权限:
"oauthScopes": [
  "https://www.googleapis.com/auth/spreadsheets",
  "https://www.googleapis.com/auth/drive" // 添加Drive权限,确保能访问表格资源
]

5. 验证服务账号的API访问权限

  • 进入Google Cloud Console,找到对应项目,确认「Google Sheets API」和「Google Drive API」已启用
  • 检查服务账号的密钥文件是否有效,无过期或权限变更

测试验证

完成以上修改后,重新部署Web App并更新Dart代码中的URL,调用sendFeedback函数即可正常添加反馈记录。

内容的提问来源于stack exchange,提问作者the cosmic introvert dude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:17:05