如何获取文件专属编辑器而非继承的文件夹所有者?
解决方案:筛选文件级专属编辑器并迁移权限
要准确获取仅直接分配给文件的编辑器(排除所有者、继承自原文件夹的编辑器),不能依赖编辑器列表的排序(顺序无固定规则),需通过Drive API获取权限的详细继承关系,结合你已有的原文件夹编辑器列表做精准过滤。以下是可行思路和代码实现:
核心逻辑
- 区分权限来源:利用Drive API获取文件的权限详情,判断每个权限是否是从父文件夹继承的(而非直接分配给文件)
- 多层过滤:依次排除文件所有者、继承权限用户、原文件夹编辑器列表中的用户,最终保留仅文件级分配的编辑器
- 迁移后重置权限:移动文件到新文件夹后,清除原有非所有者权限,再重新添加筛选后的编辑器,避免继承新文件夹的权限
代码实现
function migrateFileWithExclusiveEditors() { // 配置参数 const targetFileId = "你的目标文件ID"; const originalFolderEditors = ["课堂账号邮箱1", "课堂账号邮箱2"]; // 已有的原文件夹编辑器邮箱列表 const newFolderId = "新文件夹ID"; // 获取文件对象与所有者邮箱 const file = DriveApp.getFileById(targetFileId); const ownerEmail = file.getOwner().getEmail(); // 获取文件所有权限详情(需提前启用Drive API) const permissions = Drive.Permissions.list(targetFileId, { fields: "permissions(id,emailAddress,role,permissionDetails)" }).permissions; // 筛选仅文件级分配的编辑器 const exclusiveEditors = permissions.filter(perm => { // 排除所有者 if (perm.emailAddress === ownerEmail) return false; // 排除从文件夹继承的权限 const isInherited = perm.permissionDetails.some(detail => detail.inherited); if (isInherited) return false; // 排除原文件夹编辑器列表中的用户 if (originalFolderEditors.includes(perm.emailAddress)) return false; // 仅保留编辑权限用户 return perm.role === "writer"; }).map(perm => perm.emailAddress); // 移动文件到新文件夹 const newFolder = DriveApp.getFolderById(newFolderId); file.moveTo(newFolder); // 清除文件原有非所有者权限 permissions.forEach(perm => { if (perm.emailAddress !== ownerEmail) { file.removeEditor(perm.emailAddress); } }); // 添加筛选后的专属编辑器 exclusiveEditors.forEach(email => { file.addEditor(email); }); Logger.log("已完成迁移,保留的文件级编辑器:", exclusiveEditors); }
关键说明
- 启用Drive API:在脚本编辑器左侧菜单「服务」中添加Drive API(版本选v3),否则无法调用
Drive.Permissions.list - 权限准确性:
permissionDetails.inherited字段是判断权限是否继承的核心,比单纯依赖getEditors()的结果更可靠 - 配额注意:批量处理大量文件时,需注意Drive API的每日调用配额,可通过批量请求优化
内容的提问来源于stack exchange,提问作者TinaT
相关产品推荐
相关产品推荐

