使用 GAS 将表格中列出的查看者和编辑者添加到共享云端硬盘中的文件夹和文件

Add Viewers and Editors listed on Sheets to folders and files in Shared Drive using GAS

我有一个文件夹和文件列表,需要在共享驱动器中与不同用户(如查看者和编辑者)共享。当我复制文件夹和文件时,它没有复制用户。

我有一份 sheet,其中包含以下信息。在将文件夹及其内容复制到共享驱动器之前,我拉取了查看器和编辑器。我的目标是 运行 编写代码以分别在 Share Drive 以及查看者和编辑者中提取新文件夹或文件 ID。

复制到共享云端硬盘以获取查看者和编辑者之前的信息: 路径、名称、文件夹 ID、用户访问权限、所有者、查看者、编辑者、Folder/File日期

复制到共享云端硬盘后的信息: 路径、名称、文件夹 ID、用户访问权限、查看者、编辑者、Folder/File日期

我过去使用过此代码,并且适用于 MyDrive 文件夹共享(共享给 <3 人)但是当我尝试对共享驱动器执行相同操作时 folder/files,它似乎没有上班。有没有一种简单的方法可以添加这些用户并静默共享文件夹和文件?

 function setPermissions(){
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName('sheetname');
  var start = 2;
  var last = sheet.getLastRow();
  var sheetValues = ssFilesSheet.getRange(start,1,last,ssFilesSheet.getLastColumn()).getValues();

  for (var i = 0; i < sheetValues.length; i++) {
    var row = sheetValues[i];   
    var id = row[0];
    var reader = row[3];
    var writer = row[4];

    var roles = {
  writer: [writer],
  reader: [reader]      
};

for(var key in roles) {
  var role = roles[key];
  role.forEach(function (email) {
    var resource = {
      role: key,
      type: "user",
      value: email
    }
    if(key == "commenter") {
      resource.role = "reader";
      resource.additionalRoles = ["writer"]
    }        
    Drive.Permissions.insert(resource, 
                             id, 
                             {sendNotificationEmails: false, 
                              // supportsTeamDrives:true,
                              supportsAllDrives: true, 
                              // useDomainAdminAccess:false });
                             });

  }
}

非常感谢您的宝贵时间和帮助!

  • 要为共享驱动器上的文件将用户设置为 writerreader,目前您需要将请求参数 supportsAllDrives 设置为 true ,因此在 Apps 脚本中:
Drive.Permissions.insert(
        {
          'role': 'owner',
          'type': 'user',
          'value': 'user email'
        },
        folder/fileid,
        {
          'sendNotificationEmails': 'false',
          'supportsAllDrives' : `true`
        });
  • 目前无法通过驱动器 API 将用户设置为共享驱动器上文件的 owner。已经有对此的功能请求,因此很可能 Google 将来会合并此功能。

更新

根据您更新的代码,如果您想提取位于同一单元格中的多个电子邮件地址,您需要将它们作为字符串检索并将它们转换为数组,例如split().

样本:

 for (var i = 0; i < sheetValues.length; i++) {

    var row = sheetValues[i];   
    var id = row[0];
    var reader = row[1];
    var writer = row[2];

    var roles = {
      writer: writer,
      reader: reader
    };

    for(var key in roles) {
      var role = roles[key];
      var roleArray = role.split(", ");
      roleArray.forEach(function (email) {
        if(email !="" && email !=" "){
          var resource = {
            role: key,
            type: "user",
            value: email
          }
          if(key == "commenter") {
            resource.role = "reader";
            resource.additionalRoles = ["writer"]
          }        
          Logger.log("value: " + email);
          //Customize parameters sendNotificationEmails:false,supportsTeamDrives:true,useDomainAdminAccess:false
          Drive.Permissions.insert(resource, 
                                   id, 
                                   {sendNotificationEmails: false, 
                                    // supportsTeamDrives:true,
                                    supportsAllDrives: true, 
                                    // useDomainAdminAccess:false });
                                   });
        }
      })
    };

  }
  ssFilesSheet.getRange(i+2,6).setValue('Added User Permissions');