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

非所有者账号运行Google Apps Script时遇DriveApp权限拒绝问题

问题原因及解决方案

核心错误原因

1. 原文件复制权限不足

非所有者用户运行脚本时,执行DriveApp.getFileById(ssID).makeCopy()需要对原电子表格拥有复制权限。如果原文件的共享设置里勾选了「禁止复制、打印和下载」(哪怕给了编辑权限),这一步会直接抛出Access denied: DriveApp错误。

2. 所有权转移的权限限制

就算复制成功,副本默认所有者是运行脚本的用户。普通Google账号用户没法把自己Drive里的文件所有权转给外部账号(仅Google Workspace域内有特殊权限),所以你脚本里的setOwner("amadle11@gmail.com")这一步本身就不具备执行权限,同样会触发错误。

另外你原本的逻辑有问题:先加编辑者再转所有权,但实际上转所有权后原用户会自动失去所有者权限,而且这一步根本执行不了。

修正后的实现方案

要实现需求,必须让脚本以原文件所有者(你的账号)的身份执行,具体用「可安装触发器」来实现:

  1. 用你的账号(amadle11@gmail.com)打开原电子表格,创建可安装触发器(比如绑定按钮点击,或者表单提交事件),触发器授权时选择你的账号权限。
  2. 修改后的脚本如下:
function makeCopy() {
  var title = SpreadsheetApp.getActiveSheet().getRange("B1").getValue();
  SpreadsheetApp.getActive().toast("正在创建你的表格...", "请稍候", 5);

  // 获取触发脚本的用户邮箱(可安装触发器下,Session.getActiveUser()是触发用户)
  var email = Session.getActiveUser().getEmail();
  var ssID = SpreadsheetApp.getActiveSpreadsheet().getId();
  
  // 以你的身份创建副本,直接存到你的Drive中,默认所有者就是你
  var copyFile = DriveApp.getFileById(ssID).makeCopy(title);
  var copyID = copyFile.getId();
  
  // 给触发用户添加编辑权限
  copyFile.addEditor(email);
  
  // 设置共享权限(根据需求调整,不需要可以删掉)
  copyFile.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.EDIT);
  
  // 弹出窗口打开新表格
  var url = "https://docs.google.com/spreadsheets/d/" + copyID;
  var html = HtmlService.createHtmlOutput('<script>window.open("' + url + '");</script>').setSandboxMode(HtmlService.SandboxMode.IFRAME);
  SpreadsheetApp.getUi().showModelessDialog(html, "表格已创建!");
}

关键说明

  • 可安装触发器会以创建它的账号(你)的权限运行脚本,所有Drive操作都拥有所有者权限,不会出现权限错误。
  • 普通用户触发脚本时,副本直接创建在你的Drive里,你始终是所有者,同时能正常给用户添加编辑权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:10:31