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

使用Google Drive API v2添加权限后移除指定子文件夹权限的问题

解决Drive API v2共享子文件夹权限移除问题

你的核心问题是删除权限时用错了参数,Drive.Permissions.delete需要传入权限ID,而非你定义的resourceView对象。另外,共享根文件夹时,子文件夹的权限是自动生成的独立项,每个子文件夹的权限ID都不同,所以得逐个遍历目标子文件夹,找到对应用户的权限后再删除。

关键修改点

  1. 获取子文件夹的对应权限ID:对每个需要移除权限的子文件夹,调用Drive.Permissions.list()获取所有权限列表,筛选出目标邮箱对应的reader权限项,提取其ID。
  2. 正确调用删除接口:使用子文件夹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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:12:25