非所有者账号运行Google Apps Script时遇DriveApp权限拒绝问题
问题原因及解决方案
核心错误原因
1. 原文件复制权限不足
非所有者用户运行脚本时,执行DriveApp.getFileById(ssID).makeCopy()需要对原电子表格拥有复制权限。如果原文件的共享设置里勾选了「禁止复制、打印和下载」(哪怕给了编辑权限),这一步会直接抛出Access denied: DriveApp错误。
2. 所有权转移的权限限制
就算复制成功,副本默认所有者是运行脚本的用户。普通Google账号用户没法把自己Drive里的文件所有权转给外部账号(仅Google Workspace域内有特殊权限),所以你脚本里的setOwner("amadle11@gmail.com")这一步本身就不具备执行权限,同样会触发错误。
另外你原本的逻辑有问题:先加编辑者再转所有权,但实际上转所有权后原用户会自动失去所有者权限,而且这一步根本执行不了。
修正后的实现方案
要实现需求,必须让脚本以原文件所有者(你的账号)的身份执行,具体用「可安装触发器」来实现:
- 用你的账号(amadle11@gmail.com)打开原电子表格,创建可安装触发器(比如绑定按钮点击,或者表单提交事件),触发器授权时选择你的账号权限。
- 修改后的脚本如下:
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
相关产品推荐
相关产品推荐

