You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Google Directory API合并多页返回的组成员列表?

问题:如何批量追加Google Directory API分页返回的群组成员?

我通过Google Directory API获取Google群组成员,API返回的结果结构如下:

{
    'etag': '"..."',
    'kind': 'admin#directory#members',
    'members': [
        {'email': 'a@a.com', 'etag': '"..."', 'id': '....', 'kind': 'admin#directory#member', 'role': 'MEMBER', 'type': 'USER'},
        {'email': 'b@a.com', 'etag': '"..."', 'id': '...', 'kind': 'admin#directory#member', 'role': 'MEMBER', 'type': 'USER'},
        ...
    ],
    'nextPageToken': '...'
}

因为结果是分页的,我想把后续页面的成员追加到同一个字典的members列表里,但现有代码里的memberEmails.update(member_results)会覆盖已有键,没法实现需求,该怎么改?有哪些替代方案?

原代码:

for group in groups_list:
    members_service = service.members()
    member_request = members_service.list(groupKey=group['email'], maxResults=200, roles='MEMBER')     
    memberEmails = {}
    while member_request is not None:
        member_results = member_request.execute()
        memberEmails.update(member_results)
        member_request = members_service.list_next(member_request, member_results)

方案一:单独维护成员列表,最后组装字典

直接用一个列表存储所有成员,把每一页的members都追加进去,最后再和元数据(如etag、kind)组装成目标字典:

for group in groups_list:
    members_service = service.members()
    member_request = members_service.list(groupKey=group['email'], maxResults=200, roles='MEMBER')     
    # 初始化空列表存所有成员
    all_members = []
    # 临时存储第一页的元数据
    member_meta = {}
    while member_request is not None:
        member_results = member_request.execute()
        # 第一次循环时保存元数据(etag、kind等)
        if not all_members:
            member_meta = {k: v for k, v in member_results.items() if k != 'members' and k != 'nextPageToken'}
        # 追加当前页的成员到总列表
        if 'members' in member_results:
            all_members.extend(member_results['members'])
        member_request = members_service.list_next(member_request, member_results)
    # 组装最终的字典
    memberEmails = member_meta.copy()
    memberEmails['members'] = all_members

方案二:直接操作目标字典的members列表

如果想直接维护目标字典,就检查字典中是否已有members键,没有则初始化,有则追加新成员:

for group in groups_list:
    members_service = service.members()
    member_request = members_service.list(groupKey=group['email'], maxResults=200, roles='MEMBER')     
    memberEmails = {}
    while member_request is not None:
        member_results = member_request.execute()
        # 处理成员列表
        if 'members' in member_results:
            if 'members' in memberEmails:
                # 已有成员列表,追加新成员
                memberEmails['members'].extend(member_results['members'])
            else:
                # 首次加载,直接赋值
                memberEmails['members'] = member_results['members']
        # 处理元数据(仅保留第一页的etag、kind)
        if not memberEmails:
            memberEmails.update({k: v for k, v in member_results.items() if k != 'members' and k != 'nextPageToken'})
        member_request = members_service.list_next(member_request, member_results)

补充说明

  • 原代码的update方法确实会覆盖字典中的重复键(比如每一页的etag、nextPageToken),这不符合追加成员的需求。
  • 关于元数据:如果API每一页返回的etag、kind值一致,取第一页的即可;如果有差异,可根据实际需求决定保留哪一页的内容。

内容的提问来源于stack exchange,提问作者bobz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:35:26