Указание источников переопределяет синхронизацию с помощью Google Script и People API

#google-apps-script #google-people-api

Вопрос:

Я запускаю этот код, используя «Попробуйте» Google по адресу https://developers.google.com/people/api/rest/v1/people.connections/list.

 <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"]
 

из функции «выполнить» код возвращает только контакты, измененные с момента установки последнего маркера синхронизации (мой желаемый результат). Однако, когда я включаю эту строку, возвращаются все мои контакты. У кого — нибудь есть идеи, почему это происходит и как этого избежать (кроме удаления строки-мне нужно исключить источники ДОМЕНА и ПРОФИЛЯ)? Спасибо!

Ответ №1:

Согласно документации:

  1. источники[]

    Необязательный. Маска того, какие типы источников возвращать. По умолчанию используются значения READ_SOURCE_TYPE_CONTACT и READ_SOURCE_TYPE_PROFILE, если они не заданы.

  2. 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"] (а может быть, вы также изменили что-то еще?).

Комментарии:

1. Да, так оно и было. Я думал, что убедился, что все было так же, но когда я вернулся, я обнаружил, что в полях person в моей функции обновления токенов синхронизации отсутствует параметр. Я поместил все свои поля person в глобальный массив и использовал их каждый раз, когда на них ссылаются, чтобы обеспечить согласованность. Спасибо!