【问题标题】:Accessing Files and Folders in Team Drive访问团队云端硬盘中的文件和文件夹
【发布时间】:2018-06-21 03:43:30
【问题描述】:

我正在使用 Google Apps Script 和 Drive API V2(我认为 V3 还没有在脚本中可用)在 Team Drive 内自动创建文件。我想用脚本添加编辑器,但没有成功。

我可以使用标准DriveApp 方法中的FolderIterator 访问团队云端硬盘和子文件夹。

尝试 1

function addUserToTeam(email, folders) {

  // Open the team drive and get all the folders
  var teamFolders = DriveApp.getFolderById('TEAMDRIVEIDSTRING').getFolders();

  var folders = ["folderIdToMatch"]  // This may hold multiple folders

  try {
  // Loop an array of folder IDs
    for(var i=0; i<folders.length; i++) {

      // Check the team drive folders for a matching name
      while(teamFolders.hasNext()) {
        var teamFolder = teamFolders.next();
        if(folders[i] == teamFolder.getId()) {
          teamFolder.addEditor(email);
        }
      }
    }
  } catch(e) {
    Logger.log(e);
  }
}

Exception: Cannot use this operation on a Team Drive item 失败。

尝试 2

我尝试了 Drive API,将 teamFolder.addEditor(email) 替换为 Permissions 资源:

if(folders[i] == teamFolder.getId()) {
  var resource = {
    "type":"user",
    "role":"writer",
    "value": email
  }
  Drive.Permissions.insert(resource, teamFolder.getId());
}

这会失败并出现File not found 错误。

我可以使用DriveApp 方法找到文件夹(或文件)。使用 Drive API 的任何尝试都失败了。

我找不到任何说明 API 无法访问团队云端硬盘文件的文档。我的方法有问题吗?

【问题讨论】:

  • 你可以在团队驱动器中添加一个组并使用 GAS 管理该组吗?似乎是处理此问题的最简单方法。

标签: google-apps-script google-drive-api google-drive-shared-drive


【解决方案1】:

经过更多研究和挖掘,以下是针对具有类似用例的人的解决方案。

  1. 您可以访问整个团队云端硬盘中的文件或云端硬盘中的文件,但不能访问文件夹。这样做是为了防止意外将敏感信息目录的访问权限授予不应访问的人。

  2. 要授予访问权限,supportsTeamDrives 是请求正文中的可选参数,它采用 boolean 值。将此设置为 true 并传入 API 调用。下面是一个成功的函数。

  3. 实现我所描述的结果的唯一方法是使用多个团队驱动器并根据某些事件向用户授予访问权限。另一种选择是在项目期间将用户提升为完全权限(从编辑或查看),然后在完成后撤消。

将用户添加到团队云端硬盘

(这也适用于驱动器中的单个文件)

// Using Google Apps Script with v2 of the Drive API enabled
function addToTeamDrive() {      
  var resource = {
      'value': emailString,
      'type': 'user',
      'role': 'writer'
    }

    // If you have several Team Drives, loop through and give access
    try {
      var TeamDrive = Drive.Teamdrives.list();
      for(var i = 0; i < TeamDrive.items.length; i++) {
        if(TeamDrive.items[i].name === "Team Drive String") {
          // This ID may also be a single file inside a Team Drive
          var id = TeamDrive.items[i].id;
        }
      }

      // Add user permissions to the matched Drive
      Drive.Permissions.insert(resource, id, {"supportsTeamDrives": true});
    } catch(e) {
      Logger.log(e);
    }
}

【讨论】:

  • 关于这个的问题 - 我想使用相同的,但我对如何将我在表格上的 FileId 合并感到困惑。如何在“try {}...”中循环遍历该 fileIds
【解决方案2】:

您可以访问,但有很多您不能像 removeFile() 或 getUrl() 那样做,即使您拥有完全访问权限。你仍然会得到

{error: "Exception: Cannot use this operation on a Team Drive item."}

解决方法是在文件/文件夹上使用setTrashed() 而不是removeFile()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2019-02-26
    • 2020-02-21
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多