Search code examples
google-apps-scriptgoogle-apigoogle-drive-apigoogle-drive-shared-drive

Get permissions for a TeamDrive folder


I am trying to get the list of users of have access (Edit, Comment, View ...) for a TeamDrive Root Folder not a TeamDrive file.

First try :

var folders = Drive.Teamdrives.list({
  pageSize:100,
  pageToken:folderPT
});

for (var i = 0; i < folders.items.length; i++)
    {
      var folder = folders.items[i];

      var teamDrive = Drive.Teamdrives.get(folder.id);
      var test = DriveApp.getFolderById(folder.id);
      Logger.log(test.getEditors());
    }

With which methods I have to work ? Is it possible to do this ?

The response from my code is only empty results:

[18-09-05 14:18:36:282 CEST] []
[18-09-05 14:18:36:771 CEST] []
[18-09-05 14:18:37:143 CEST] []
[18-09-05 14:18:37:625 CEST] []
[18-09-05 14:18:38:306 CEST] []
[18-09-05 14:18:38:690 CEST] []

Edit : In fact the code above is working, my test folder was empty. But the answer below is better.


Solution

  • You can use a file to determine the permissions set on the file itself or inherited from the Team Drive.

    You can do this via the Permissions namespace within Drive.

    function getFilePermissions(fileId) {
    
      var permissions = Drive.Permissions.list(fileId,  {supportsTeamDrives:true,
                                                         corpora: 'teamDrive',
                                                         includeTeamDriveItems: true})
      .items
      .reduce(function(all, i){
    
        var role = i.teamDrivePermissionDetails.map(function(permission){
    
          // commenters are flagged as having an additional role as readers
          var activeRole = (i.additionalRoles) ?  i.additionalRoles[0] : permission.role;
    
          return {emailAddress: i.emailAddress,
                  teamDrivePermissionType: permission.teamDrivePermissionType,
                  role: activeRole};
        });
    
        return all.concat(role);
      }, []);
    
      return permissions;
    }
    

    This function reduces the amount of information returned by the Permissions.list call to return an object array from which you can ascertain a whole bunch of information. A single user could be a reader of the Team Drive but a Writer (editor) of the file itself, this function returns both permissions.

    e.g.

     [
        {
            "emailAddress": "geoff@example.com",
            "teamDrivePermissionType": "member",     <-- a Team Drive permission
            "role": "organizer"                      <-- an Team Drive domain member
        },
        {
            "emailAddress": "jonathon@example.com", 
            "teamDrivePermissionType": "member",
            "role": "writer"                         <-- a non-Domain member
        },
        {
            "emailAddress": "jonathon@example.com",
            "teamDrivePermissionType": "file",
            "role": "writer"                         <-- editor set on the file share
        },
        {
            "emailAddress": "svea@example.com",
            "teamDrivePermissionType": "file",
            "role": "reader"                         <-- viewing rights set at file level
        },
        {
            "emailAddress": "info@example.com",
            "teamDrivePermissionType": "member",
            "role": "organizer"
        },
        {
            "emailAddress": "rebekkah@example.com",
            "teamDrivePermissionType": "file",
            "role": "commenter"                      <-- this is a reader with comment rights
        }
    ]
    

    Filter it by member or file (non-member), or by role: reader, writer, etc..

    For more information on the Permissions object schema check here: Permissions Resource