Using Directory API in Google-Apps-Script, how to get groups inside a group

前端 未结 1 1027

I\'m working on a script that gets all goups in my domain and lists all users in these groups.

I rewrote this script because GroupsManager is deprecated

1条回答
  •  温柔的废话
    2020-12-30 17:56

    AdminDirectory MembersCollection might be what you are looking for.

    Example snippet:

    var members = AdminDirectory.Members.list('testgroup@example.com').members;
    for (var i = 0; i < members.length; i++) {
      var member = members[i];
      switch (member.type) {
        case 'USER':
          Logger.log('%s is a user', member.email);
          break;
        case 'GROUP':
          Logger.log('%s is a group', member.email);
          break;
        default:
          Logger.log('This will never happen');
      }
    

    Some of my customers have groups containing groups contaning groups... forming a group tree with arbitrary depth. I use this code to get all user members in such a group tree:

    function walkTreeStack() {
      var rootGroup = 'testgroup@example.com';
      var groupTreeUsers = [];
      var groups = [];
      groups.push(rootGroup);
    
      while (groups.length > 0) {
        var currentGroup = groups.pop();
        var groupName = AdminDirectory.Groups.get(currentGroup).name;
        var groupMembers = getAllMembers_(currentGroup);
    
        for (var i in groupMembers) {
          if (groupMembers[i].type == 'USER') {
            groupTreeUsers.push([groupName, groupMembers[i].email])
          }
          else if (groupMembers[i].type == 'GROUP') {
            groups.push(groupMembers[i].email)
          }
        }
      }
    
      Logger.log('There are %s user members in %s (including sub groups)', groupTreeUsers.length, groupName);
    }
    
    function getAllMembers_(group) {
      var memberPageToken, memberPage;
      var members = [];
      do {
        memberPage = AdminDirectory.Members.list(group, {
          maxResults: 200,
          pageToken: memberPageToken
        });
        var pageMembers = memberPage.members;
        if (pageMembers) {
          for (var j =0; j < pageMembers.length; j++) {
            members.push(pageMembers[j]);
          }
        }
        memberPageToken = memberPage.nextPageToken;
      } while (memberPageToken);
      return members;
    }
    

    It's slightly faster if it's done recursively but I suspect the script might crash due to memory constraints if there are a large number of sub groups and user members:

    function getGroupTreeMembers() {
      var rootGroup = 'testgroup@example.com';
      var groupTreeUsers = [];
    
      walkTreeRecursive_(rootGroup, groupTreeUsers);
    
      var groupName = AdminDirectory.Groups.get(rootGroup).name;  
      Logger.log('There are %s user members in %s (including sub groups)', groupTreeUsers.length, groupName);
    }
    
    function walkTreeRecursive_(rootGroup, groupTreeUsers) {
      var groupName = AdminDirectory.Groups.get(rootGroup).name;
      var groupMembers = getAllMembers_(rootGroup);
      var groups = [];
      for (var i in groupMembers) {
        if (groupMembers[i].type == 'USER') {
          groupTreeUsers.push([groupName, groupMembers[i].email])
        }
        else if (groupMembers[i].type == 'GROUP') {
          groups.push(groupMembers[i].email)
        }
      }
      for (var i in groups) {
        walkTreeRecursive_(groups[i], groupTreeUsers);
      }
    }
    

    For more information please visit:

    https://developers.google.com/admin-sdk/directory/v1/reference/members#resource

    0 讨论(0)
提交回复
热议问题