使用 Google Script 和 People API 指定来源会覆盖同步令牌

Posted

技术标签:

【中文标题】使用 Google Script 和 People API 指定来源会覆盖同步令牌【英文标题】:Specifying sources overrides synctoken using Google Script and People API 【发布时间】:2021-10-14 09:52:21 【问题描述】:

我在https://developers.google.com/people/api/rest/v1/people.connections/list 使用 Google 的“Try It”运行此代码。

<script src="https://apis.google.com/js/api.js"></script>
<script>
  /**
   * Sample javascript code for people.people.connections.list
   * See instructions for running APIs Explorer code samples locally:
   * https://developers.google.com/explorer-help/guides/code_samples#javascript
   */

  function authenticate() 
    return gapi.auth2.getAuthInstance()
        .signIn(scope: "https://www.googleapis.com/auth/contacts https://www.googleapis.com/auth/contacts.readonly")
        .then(function()  console.log("Sign-in successful"); ,
              function(err)  console.error("Error signing in", err); );
  
  function loadClient() 
    return gapi.client.load("https://people.googleapis.com/$discovery/rest?version=v1")
        .then(function()  console.log("GAPI client loaded for API"); ,
              function(err)  console.error("Error loading GAPI client for API", err); );
  
  // Make sure the client is loaded and sign-in is complete before calling this method.
  function execute() 
    return gapi.client.people.people.connections.list(
      "resourceName": "people/me",
      "personFields": "names",
      "sources": [
        "READ_SOURCE_TYPE_CONTACT"
      ],
      "syncToken": "MisAPB3nNAAAABIIsK7pgqKn8gIQsK7pgqKn8gI4IFedl0ChD-QAdeetUtBPOgw2ODIzOTA3NzkxNzA="
    )
        .then(function(response) 
                // Handle the results here (response.result has the parsed body).
                console.log("Response", response);
              ,
              function(err)  console.error("Execute error", err); );
  
  gapi.load("client:auth2", function() 
    gapi.auth2.init(client_id: "YOUR_CLIENT_ID");
  );
</script>
<button onclick="authenticate().then(loadClient)">authorize and load</button>
<button onclick="execute()">execute</button>

当我排除

"sources": ["READ_SOURCE_TYPE_CONTACT"]

从“执行”函数中,代码仅返回自上次设置同步令牌以来更改的联系人(我想要的结果)。但是,当我包含该行时,我的 all 联系人都会返回。任何人都知道为什么会发生这种情况以及如何避免它(除了删除该行 - 我需要排除 DOMAIN 和 PROFILE 源)?谢谢!

【问题讨论】:

【参考方案1】:

根据documentation:

    来源[]

    可选。要返回的源类型的掩码。如果未设置,则默认为 READ_SOURCE_TYPE_CONTACT 和 READ_SOURCE_TYPE_PROFILE。

    When the pageToken or syncToken is specified, all other request parameters must match the first call..

换句话说,一般来说,无论您是否设置"sources": ["READ_SOURCE_TYPE_CONTACT"],它都不会产生影响——因为sources自动默认为READ_SOURCE_TYPE_CONTACT

API 未正确返回唯一新联系人的最可能原因是您通过排除 "sources": ["READ_SOURCE_TYPE_CONTACT"] 行更改了请求(也许您还更改了其他内容?)。

【讨论】:

是的,就是这样。我以为我已经确保一切都是一样的,但是当我回过头来时,我发现我的同步令牌更新函数中的人员字段缺少一个参数。我将所有人员字段放入一个全局数组中,并在每次引用它时使用它以确保一致性。谢谢!

以上是关于使用 Google Script 和 People API 指定来源会覆盖同步令牌的主要内容,如果未能解决你的问题,请参考以下文章

从 Google People API 搜索中获取姓名和电话号码

使用 google people api 获取群组的联系人

将Google People API与服务帐户配合使用

在 Google Apps 脚本中使用 Google People API 删除联系人返回 404 错误

使用 Google Scripts 从 Google People API 获取 google 联系人电子邮件目录中的电子邮件列表

使用 Google People API (Java) 检索有关联系人的信息