0

I am trying to retrieve all the members of each group in my company. My code works fine unless there are more than 200 members in a group, then it outputs the group ID a few times before actually listing the members like on "group2@company.com".

I am not sure how the pageToken works, so not able to get a single output for groups with more than 200 members. Thanks again for any assistance on this.

Also, I added del all_members[:] so that it will show only members for that group, otherwise it append members of the previous group.

Output:

group1@company.com: 2 member(s)
user3@company.com - OWNER
user4@company.com - MEMBER

group2@company.com: 634 member(s)

group2@company.com: 634 member(s)

group2@company.com: 634 member(s)

group2@company.com: 634 member(s)
user1@company.com - MEMBER
user2@company.com - MEMBER
...

Code:

directory_service = authenticate()

all_groups = []
all_members = []
page_token = None
new_page_token = None
params = {'domain': 'company.com', 'customer': 'my_customer'}

while True:
  try:
    if page_token:
      params['pageToken'] = page_token
    current_page = directory_service.groups().list(**params).execute()

    all_groups.extend(current_page['groups'])
    page_token = current_page.get('nextPageToken')
    if not page_token:
      break
  except errors.HttpError as error:
    print 'An error occurred: %s' % error
    break

for group in all_groups:
  group_key = group['email']
  new_params = {'groupKey': '%s' % group_key, 'maxResults': '500'}

  if group['directMembersCount'] == '0':
    continue
  else:
    while True:
      try:
        if new_page_token:
          new_params['pageToken'] = new_page_token
        new_current_page = directory_service.members().list(**new_params).execute()

        print ''
        print '%s: %s member(s)' % (group['email'], group['directMembersCount'])

        all_members.extend(new_current_page['members'])
        new_page_token = new_current_page.get('nextPageToken')

        if not new_page_token:
          break
      except errors.HttpError as error:
        print 'An error occurred: %s' % error
        break

  for member in all_members:
    print '    %s - %s' % (member['email'], member['role'])
  del all_members[:]

1 Answers1

0

Moving the group print statement outside of the while loop worked for me. I'm not sure why I didn't see it before. Hope this helps others.

Code:

directory_service = authenticate()

all_groups = []
all_members = []
page_token = None
new_page_token = None
params = {'domain': 'company.com', 'customer': 'my_customer'}

while True:
  try:
    if page_token:
      params['pageToken'] = page_token
    current_page = directory_service.groups().list(**params).execute()

    all_groups.extend(current_page['groups'])
    page_token = current_page.get('nextPageToken')
    if not page_token:
      break
  except errors.HttpError as error:
    print 'An error occurred: %s' % error
    break

for group in all_groups:
  group_key = group['email']
  new_params = {'groupKey': '%s' % group_key, 'maxResults': '500'}

  if group['directMembersCount'] == '0':
    continue
  else:
    while True:
      try:
        if new_page_token:
          new_params['pageToken'] = new_page_token
        new_current_page = directory_service.members().list(**new_params).execute()
        all_members.extend(new_current_page['members'])
        new_page_token = new_current_page.get('nextPageToken')

        if not new_page_token:
          break
      except errors.HttpError as error:
        print 'An error occurred: %s' % error
        break

  print ''
  print '%s: %s member(s)' % (group['email'], group['directMembersCount'])

  for member in all_members:
    print '    %s - %s' % (member['email'], member['role'])
  del all_members[:]