Google Apps Script移除Drive所有文件单用户权限报错解决
问题根因
- 触发
No such user报错的直接原因:未做权限校验直接调用removeEditor(),只要当前文件没有单独给目标邮箱授予编辑权限(比如用户是查看者身份、通过公共链接/组织域共享获得权限、根本不在该文件的权限列表内),调用该方法就会抛出这个错误。 - 日志打印
getEditors()返回结果仅显示[DriveUser]属于正常现象:这是DriveUser类的默认字符串转换结果,直接打印整个用户对象数组不会输出真实邮箱,必须遍历数组调用每个用户实例的getEmail()方法才能拿到具体的邮箱地址。 - 原脚本存在逻辑遗漏:仅调用
removeEditor()不会移除用户的查看者权限,就算不报错,用户如果被授予查看权限依然可以访问文件;另外DriveApp.getFiles()默认仅能获取你「我的云端硬盘」下的文件,不会覆盖共享云端硬盘、他人共享给你的文件。
修复方案
- 权限移除前增加校验逻辑:先获取当前文件的编辑、查看用户邮箱列表,确认目标用户确实在权限列表中再执行移除操作,避免无效调用抛错。
- 统一用
removeViewer()方法移除权限:该方法会自动清除目标用户对文件的所有访问权限,无论用户当前是编辑还是查看身份,无需分开调用两个移除方法。 - 增加异常捕获:针对你没有权限修改共享设置的文件(比如你是编辑但不是所有者的文件),捕获错误后跳过即可,避免整个脚本中断运行。
- 排查权限时正确获取用户邮箱:遍历
getEditors()/getViewers()返回的用户数组,逐个调用getEmail()拿到真实邮箱地址,不要直接打印整个数组。
修正后可直接运行的代码
function removeTargetUserAccess() { // 配置需要移除所有访问权限的目标用户邮箱 const TARGET_EMAIL = "mickey@mouse.com"; // 获取我的云端硬盘下的所有文件 const fileIterator = DriveApp.getFiles(); while (fileIterator.hasNext()) { const currentFile = fileIterator.next(); try { // 拿到当前文件所有编辑、查看用户的邮箱列表 const editorMails = currentFile.getEditors().map(user => user.getEmail()); const viewerMails = currentFile.getViewers().map(user => user.getEmail()); // 仅当目标用户确实在权限列表中时执行移除 if (editorMails.includes(TARGET_EMAIL) || viewerMails.includes(TARGET_EMAIL)) { currentFile.removeViewer(TARGET_EMAIL); console.log(`已移除${TARGET_EMAIL}对文件「${currentFile.getName()}」的访问权限`); } } catch (error) { // 跳过无权限修改共享设置的文件,打印日志后继续处理下一个 console.log(`处理文件「${currentFile.getName()}」失败:${error.message}`); } } }
注意事项
- 如果文件开启了公共链接访问/组织域内全员可访问:单独移除单个用户权限不会生效,需要先将文件共享权限修改为「受限」,再执行上述移除操作。
- 脚本首次运行会弹出Google授权提示,需要授予脚本云端硬盘读写权限才能正常执行。
- 如果你的账号下文件数量较多,脚本可能触发Google Apps Script的运行时长限额,可以分批处理文件,每次处理指定数量的文件即可。
- 如果需要处理共享云端硬盘内的文件,需要额外开启Drive高级服务,编写遍历共享云端硬盘的逻辑。
内容的提问来源于stack exchange,提问作者Tak
相关产品推荐
相关产品推荐

