使用Google Drive API v2添加权限后移除指定子文件夹权限的问题
解决Drive API v2共享子文件夹权限移除问题
你的核心问题是删除权限时用错了参数,Drive.Permissions.delete需要传入权限ID,而非你定义的resourceView对象。另外,共享根文件夹时,子文件夹的权限是自动生成的独立项,每个子文件夹的权限ID都不同,所以得逐个遍历目标子文件夹,找到对应用户的权限后再删除。
关键修改点
- 获取子文件夹的对应权限ID:对每个需要移除权限的子文件夹,调用
Drive.Permissions.list()获取所有权限列表,筛选出目标邮箱对应的reader权限项,提取其ID。 - 正确调用删除接口:使用子文件夹ID和筛选出的权限ID作为参数,调用
Drive.Permissions.delete()完成权限移除。
修改后的完整代码
function shareFolders() { var email = "sample@email.com"; var searchTerm = "FileNumber####"; // 转义搜索条件里的单引号,避免语法错误 var escapedSearchTerm = searchTerm.replace(/'/g, "\\'"); var filenoFolders = DriveApp.searchFolders("title contains '" + escapedSearchTerm + "' and trashed = false and hidden = false"); var filenoFolder = filenoFolders.next(); var internalDocsFolder = filenoFolder.getFoldersByName("Internal Documents").next(); var subfolders = internalDocsFolder.getFolders(); var incomingDocsFolder = internalDocsFolder.getFoldersByName("Disclosure").next() .getFoldersByName("Our Client").next() .getFoldersByName("Incoming Documents").next(); var resourceView = { "role": "reader", "type": "user", "value": email }; var resourceEdit = { "role": "writer", "type": "user", "value": email }; try { // 共享根文件夹,递归赋予子文件夹权限 Drive.Permissions.insert(resourceView, filenoFolder.getId(), {sendNotificationEmails: false}); Utilities.sleep(2000); // 等待权限同步 while (subfolders.hasNext()){ var subfolder = subfolders.next(); var folderName = subfolder.getName(); if (folderName === "Disclosure" || folderName === "Court Documents" || folderName === "Searches") { console.log(`${folderName} - 无需更改访问权限`); continue; } console.log(`${folderName} - 移除查看者权限`); // 获取当前子文件夹的所有权限 var permissions = Drive.Permissions.list(subfolder.getId()).items; // 筛选出目标邮箱的reader权限 var targetPermission = permissions.find(function(perm) { return perm.value === email && perm.role === "reader"; }); if (targetPermission) { // 删除对应权限 Drive.Permissions.delete(subfolder.getId(), targetPermission.id); console.log(`${folderName} - 权限移除成功`); } else { console.log(`${folderName} - 未找到目标权限`); } } Utilities.sleep(2000); // 给指定子文件夹赋予编辑权限 Drive.Permissions.insert(resourceEdit, incomingDocsFolder.getId(), {sendNotificationEmails: false}); console.log("共享操作完成"); } catch(e){ console.log("捕获到错误: " + e.message); } }
额外说明
- 添加了
{sendNotificationEmails: false}参数,避免每次共享都自动发邮件给用户,不需要的话可以直接删除该参数。 - 用
find方法筛选权限更简洁,如果你的Apps Script环境不支持ES6语法,可以替换为for循环遍历权限列表。 - 优化了错误日志,打印
e.message能看到更详细的错误原因,方便排查问题。
内容的提问来源于stack exchange,提问作者Databoy2k
相关产品推荐
相关产品推荐

