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

如何迭代Google Admin SDK UsersService.List返回的分页用户列表?

Google Admin API 全量用户分页迭代实现(Go语言)

针对你遇到的分页迭代问题,有两种简洁的解决方式,均基于Google Go客户端库的原生能力:

方法一:手动管理PageToken循环遍历

核心思路是每次请求时传入上一页返回的NextPageToken,直到Token为空(表示所有页已遍历完成)。你可以通过PageToken()方法给List请求指定分页Token,这就是你要找的「指定下一页Token」的入口。

完整代码示例:

package main

import (
	"context"
	"fmt"
	"os"

	admin "google.golang.org/api/admin/directory/v1"
	"google.golang.org/api/option"
	"google.golang.org/api/googleapi"
)

func main() {
	ctx := context.Background()
	credentialsPath := "path/to/your/credentials.json"
	
	adminService, err := admin.NewService(ctx,
		option.WithCredentialsFile(credentialsPath),
	)
	if err != nil {
		fmt.Printf("创建Admin服务失败: %v\n", err)
		os.Exit(1)
	}

	var pageToken string
	for {
		// 构建List请求,若存在分页Token则传入
		listReq := adminService.Users.List().Customer("my_customer")
		if pageToken != "" {
			listReq = listReq.PageToken(pageToken)
		}

		usersResp, err := listReq.Do()
		if err != nil {
			if e, ok := err.(*googleapi.Error); ok {
				fmt.Printf("错误码: %v\n", e.Code)
				fmt.Printf("错误信息: %v\n", e.Message)
			} else {
				fmt.Printf("请求失败: %v\n", err)
			}
			os.Exit(1)
		}

		// 处理当前页的用户数据
		for _, user := range usersResp.Users {
			fmt.Printf("用户: %s (%s)\n", user.Name.FullName, user.PrimaryEmail)
		}

		// 更新分页Token,为空则终止循环
		pageToken = usersResp.NextPageToken
		if pageToken == "" {
			break
		}
	}
}

方法二:使用内置Pages迭代器(推荐)

Google客户端库提供了Pages方法,会自动帮你处理分页逻辑,无需手动管理Token,代码更简洁。

完整代码示例:

package main

import (
	"context"
	"fmt"
	"os"

	admin "google.golang.org/api/admin/directory/v1"
	"google.golang.org/api/option"
	"google.golang.org/api/googleapi"
)

func main() {
	ctx := context.Background()
	credentialsPath := "path/to/your/credentials.json"
	
	adminService, err := admin.NewService(ctx,
		option.WithCredentialsFile(credentialsPath),
	)
	if err != nil {
		fmt.Printf("创建Admin服务失败: %v\n", err)
		os.Exit(1)
	}

	// 调用Pages方法自动遍历所有分页
	err = adminService.Users.List().Customer("my_customer").Pages(ctx, func(page *admin.Users) error {
		// 处理当前页用户数据
		for _, user := range page.Users {
			fmt.Printf("用户: %s (%s)\n", user.Name.FullName, user.PrimaryEmail)
		}
		return nil
	})
	if err != nil {
		if e, ok := err.(*googleapi.Error); ok {
			fmt.Printf("错误码: %v\n", e.Code)
			fmt.Printf("错误信息: %v\n", e.Message)
		} else {
			fmt.Printf("迭代失败: %v\n", err)
		}
		os.Exit(1)
	}
}

关键说明

  • PageToken()方法是你需要的指定下一页Token的入口,在UsersListCall对象上可直接调用。
  • Pages方法会自动处理分页请求,每次获取一页数据后执行回调函数,直到所有页处理完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:47:25