【问题标题】:Fetch the details of all suspended users in G-suite Admin SDK在 G-suite Admin SDK 中获取所有暂停用户的详细信息
【发布时间】:2018-11-30 02:06:43
【问题描述】:

我正在尝试提取 G-Suite Admin SDK 中所有暂停用户的详细信息,为此我在 Google Apps 脚本中编写了一个查询:

function fetchUser(){           
    var pageToken;
    var membersList = AdminDirectory.Users.list({
      domain: 'xyz.com',
      orderBy: 'email',
      query: isSuspended=true,
      maxResults: 100,
      pageToken: pageToken
    });  
    Logger.log('membersList:' +membersList);
}

我在logs 中得到的结果是:

[18-06-20 16:32:15:413 EDT] membersList:{"kind":"admin#directory#users","etag":"\"npJcgeAc7XbfkhvPm3glLSpkcPU/HMFwD2wLX237BRmKZQUJYB5ZE7U\""}

我无法在G-suite-admin-SDK 中提到的响应中看到用户列表,它表示响应应该类似于:

{
  "kind": "admin#directory#users",
  "etag": etag,
  "users": [
    users Resource
  ],
  "nextPageToken": string
}

我使用search-users 文档进行搜索查询,上面写着要使用isSuspended=true,我可以知道我做错了什么吗?

【问题讨论】:

  • 我注意到您没有指定任何请求的字段。您是否有理由不提供 fields 参数?所有 Google API 都建议使用“字段”参数来减少您和您的用户的带宽。另外-您的查询看起来不对。查询通常是字符串,而您的查询是赋值表达式的结果。
  • 我没有在user-list 中看到fields,因此我没有使用它。就赋值表达式而言,它不会在脚本中引发错误,只是为了确保不是因为我声明了var isSuspended = true,然后在生成相同输出的代码中使用了query: isSuspended。跨度>
  • isSuspended=true 是一个 Javascript 语句。 "isSuspended=true" 是一个字符串。您可以在“标准查询参数”下查看每个 Google API 中的“字段”参数
  • 我的意思是它是一个 Javascript 语句,而不是一个字符串
  • 根据您链接的参数的描述,query 参数的格式为string。因此,提供一个语句可能意味着您给它一个随机值(例如true 或undefined,这意味着您发送了以下内容:var options = {query: true} 或var options = {query: undefined},这肯定不会给出与var options = {query: "isSuspended=true"}

标签: google-apps-script google-admin-sdk google-workspace


【解决方案1】:

根据您链接的 API 文档,查询参数必须是 string。您提供了一个无效的查询 - query: isSuspended=true - 因此没有执行任何查询。

您可能会对"Search for Users" API 文档中使用看似“原始”变量和参数的示例感到困惑 - 这是因为它提供的示例仍然需要进行 URL 编码:

示例

所有查询都使用users.list 方法,该方法的HTTP 请求类似于以下内容(包括换行符以提高可读性):

获取https://www.googleapis.com/admin/directory/v1/users
?domain=主域
&query=查询参数

查询参数必须经过 URL 编码。例如,查询 query=givenName:Jane* 的 URL 编码为 query=givenName%3AJane*。此页面上的所有示例都显示未编码的查询参数。客户端库会自动处理此 URL 编码。

您可以通过重复使用 options 变量来帮助自己并改进您的代码,例如:

function getAllSuspended() {
  // Set the constant options only once.
  const options = {
    domain: 'xyz.com',
    orderBy: 'email',
    query: 'isSuspended=true',
    maxResults: 100,
    fields: "nextPageToken,users"
  };
  // Could log the options here to ensure they are valid and in the right format.

  const results = [];
  do {
    var search = AdminDirectory.Users.list(options);
    // Update the page token in case we have more than 1 page of results.
    options.pageToken = search.nextPageToken;
    // Append this page of results to our collected results.
    if(search.users && search.users.length)
      Array.prototype.push.apply(results, search.users);
  } while (options.pageToken);

  return results;
}

客户端库和应用程序脚本

Apps 脚本中的"advanced services" 是封装了底层 REST API 的 Google API 客户端库,因此您无需对传递给其方法的参数执行 URL 编码。如果您决定不想使用客户端库,而是希望使用UrlFetchApp 查询 URL,那么您需要对查询字符串进行 URL 编码。 (如果你想发出很多简单、快速、不相关的请求,并且客户端库不提供BatchHttpRequest 方法,你可以这样做:你可以使用UrlFetchApp.fetchAll 代替better performance。)

【讨论】:

  • 是否必须对查询参数进行 URL 编码,因为客户端库会自动处理这个?是否需要手动更新 pageToken,因为它也会自动处理?
  • @JijoJohny 更改页面令牌不会自动处理 - 您必须传入所需页面的令牌。在第一次调用时,您没有令牌,所以它是undefined,您会得到第一页。如果 API 的响应中不存在nextPageToken(并且您没有限制fields,或者明确请求nextPageToken 字段),那么这意味着没有更多可用页面。 Apps 脚本“高级服务”AdminDirectory 类是一个处理 URL 编码的客户端库 - 请注意,您不必显式指定 URL 等即可使用它。
  • 但我仍然可以使用我的脚本按电子邮件 ID 的字母顺序检索所有暂停用户的帐户详细信息,并且它没有使用 nextPageToken
  • @JijoJohny 有多少被暂停的用户?不到100?看看当您将 maxResults 参数从 100 更改为 1 时会发生什么。
  • 它只显示一个用户,但这次它还显示了最后一条记录的nextPageToken
【解决方案2】:

这是一个简单的错误:

function fetchUser(){           
        var pageToken;
        var membersList = AdminDirectory.Users.list({
          domain: 'xyz.com',
          orderBy: 'email',
          query: "isSuspended=true",
          maxResults: 100,
          pageToken: pageToken
        });  
        Logger.log('membersList:' +membersList);
    }

感谢@tehhowch 帮助我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    相关资源
    最近更新 更多