App Script跨项目写入CSV至GCS Bucket遇403权限不足问题
App Script跨项目写入GCS Bucket报403权限不足的解决方案
我用App Script从项目A的BigQuery表拉取数据,尝试将数据以CSV格式写入项目B的Google Cloud Storage Bucket时失败,收到403权限不足错误:
"error": { "code": 403, "message": "Insufficient Permission", "errors": [ { "message": "Insufficient Permission", "domain": "global", "reason": "insufficientPermissions" } ] }
当前使用的代码如下:
function pushCSV2Bucket(sheet_data){ var bucketName = "some_name"; var fileName = "wooqer_employee_details.csv"; var csv_payload = sheet_data.map(row=>row.join(',')).join('\n'); var url = "https://www.googleapis.com/upload/storage/v1/b/" + bucketName + "/o?uploadType=media&name=" + fileName; var options = { method: "post", contentType: "text/csv", payload: csv_payload, headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken(), "Content-Type": "text/csv" } }; try { var response = UrlFetchApp.fetch(url, options); // This will raise error if failed Logger.log('Successfully pushed CSV to GCS bucket : '+response.getContentText()); return true; } catch (error) { Logger.log("Failed to push CSV to GCS bucket: " + error); return false; } }
怀疑App Script无法同时访问两个项目,求解决方法。
核心结论
App Script完全支持跨项目访问云资源,你的问题出在OAuth权限范围配置和服务账号授权上,以下是具体修复步骤:
1. 确保OAuth令牌包含Cloud Storage权限范围
ScriptApp.getOAuthToken()默认只请求App Script项目所需的最小权限,需要手动添加Cloud Storage相关的权限范围:
- 打开App Script编辑器,点击右上角「项目设置」
- 勾选「显示"appsscript.json"清单文件」
- 编辑
appsscript.json,在oauthScopes数组中添加以下权限之一(按需选择):- 全权限:
"https://www.googleapis.com/auth/devstorage.full_control" - 仅创建对象权限:
"https://www.googleapis.com/auth/devstorage.objects.create"
- 全权限:
- 示例清单片段:
{ "oauthScopes": [ "https://www.googleapis.com/auth/bigquery", "https://www.googleapis.com/auth/devstorage.objects.create", "https://www.googleapis.com/auth/script.external_request" ] }
2. 给App Script服务账号授予项目B的GCS权限
App Script项目关联了一个专属的服务账号,需要在项目B的IAM中给该账号授权:
- 获取App Script服务账号:
- 在App Script项目设置中找到「项目编号」,服务账号格式为:
[项目编号]@appspot.gserviceaccount.com - 或者进入Google Cloud控制台,找到App Script关联的GCP项目,在IAM页面查看服务账号
- 在App Script项目设置中找到「项目编号」,服务账号格式为:
- 登录项目B的Google Cloud控制台,进入「IAM与管理员」→「IAM」
- 点击「添加」,输入上述服务账号邮箱,添加「Cloud Storage Object Admin」角色(或更细粒度的「Storage Object Creator」角色)
- 保存配置,等待权限生效(通常需要1-5分钟)
3. 代码优化(非权限问题,但可避免冗余)
代码中重复设置了Content-Type,可以去掉其中一个,比如保留headers中的配置:
var options = { method: "post", payload: csv_payload, headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken(), "Content-Type": "text/csv" } };
内容的提问来源于stack exchange,提问作者Dylan Solms
相关产品推荐
相关产品推荐

