Синхронизируем контакты между Google People и Bitrix24


В данной статье рассмотрим, как можно синхронизировать контакты между Bitrix24 и Google People.

Задача

При добавлении или редактировании контакта на стороне Google, передавать его в Bitrix24. При редактировании или добавлении контакта на стороне Битрикс — добавлять или редактировать контакт в Google

Подключение сервисов в MoreKit

Первым делом необходимо подключить Bitrix24 и Google People в MoreKit. Для этого добавим оба сервиса

Подключение Битрикс24

Перед добавлением сервиса Битрикс24 в MoreKit необходимо установить приложение наше приложение в маркетплейсе. Для установки приложения требуется подписка на маркетплейс Битрикс24

После установки приложения MoreKit в маркетплейс Битрикс24 можно приступать к добавлению сервиса в Morekit. Для этого в проекте нажмите Добавить сервис, найдите в списке Битрикс24. При подключении сервиса будет запрошена ссылка на ваш битрикс

Введите ссылку в формате https://мой-домен.bitrix24.ru. После этого произойдет редирект на страницу с вашим битриксом, подтвердите авторизацию

Если все правильно — сервис появится в списке сервисов и у него будет статус Готово

Подключение Google people

В MoreKIT нажимаем Добавить сервис, ищем в списке Google people

При нажатии на кнопку Добавить — произойдет перенаправление в google, где нужно выдать доступы приложению

Подтверждаем выдачу прав на чтение и запись контактов

После выдачи прав — сервис google people должен отобразиться в списке сервисов MoreKIT

Настройка полей в Битрикс24

Далее — необходимо создать техническое поле в карточке контакта в Битрикс24. В данном поле будем записывать resource_id . Данная переменная нужна для получения актуальных данных контакта:

  • ID ресурса google

Создаем поля в Битрикс24, тип создаваемых полей будет Строка

Пример созданного полея

После добавления полей — MoreKIT сразу их не увидит в процессах, нужно перейти в карточку подключенного сервиса Bitrix24 и нажать Обновить

Создание процессов в MoreKIT

Создадим процессы передачи данных в MoreKIT

Из google в Bitrix24

Первым делом — создадим процесс с типом Другое, данный процесс будет принимать на себя действия со стороны google и либо создавать контакт, либо обновлять существующий контакт на стороне Bitrix24

Логическая схема процесса в MoreKIT будет выглядеть следующим образом:

Описание блоков схемы

#26 Регулярные выражения — очистка номера телефона от лишних символов

#27 Найти контакта — поиск существующего контакта в Bitrix24 по очищенному номеру телефона

#29 Найти контакты — поиск контакта в Bitrix24 по email

#35 — поиск контактов bitrix24 по ID ресурса

#28 Создание контакта в Bitrix24 с заполнением телефона, resource_id, email адреса и имени контакта

#37 Создать переменную — записываем один из найденных контактов в переменную для удобства обращения

#30 Дата и время — переводим дату последнего изменения найденного контакта в Bitrix24 в секунды (timestamp)

#31 Дата и время — формируем текущую дату в секундах

#32 Посчитать — выполняем подсчет разности текущей даты и и даты последнего изменения контакта

#33 Проверка — проверяем, что разность дат > 600сек (10 мин). Данный подсчет дат нужен, чтобы избежать циклирования одинаковых событий в MoreKIT, так как если это не сделать, после изменения контакта в б24 повторно получим запрос от google, что контакт изменился

#39 Получить контакт — получаем актуальные данные контакта по ID ресурса

#34 Обновить контакт — обновляем контакт на стороне google, заполняя нужные поля из переменной Контакт

#38 Редактируем контакт на стороне Bitrix24, данные берем те, которые будут приходить нам от Google

Настройка скрипта в google

Передача данных из google будет осуществляться с помощью механизма Appscript — встроенный механизм скриптов google

Переходим в меню управления проектами google, слева выбираем раздел Мои проекты, создаем новый проект

В проекте будет автоматически создан файл код.gs с пустой функцией, стираем ее полностью и вставляем скрипты. В проекте будет два скрипта:

  • checkUpdates.gs — будет проверять новый созданный/обновленный контакт и отправлять его в MoreKIT
  • init_sync.gs — будет запускаться единоразово и создавать токен синхронизации, чтобы запомнить текущее состояние контактов

При первом запуске Check_Updates google выгрузит все контакты, которые есть в google people, по этому проверьте корректность блоков в процессах, чтобы не потерять события.

Либо — если у вас есть свой обработчик, который может принять данные — первый запуск можно выгрузить на него

Создаем файлы и вставляем скрипты

Скрипт передачи данных контактов checkUpdates.gs

В 39 строчке вставьте ссылку на созданный процесс в MoreKIT, которая находится в первоначальном блоке

function checkUpdates() {
  var scriptProps = PropertiesService.getScriptProperties();
  var etagsStore = scriptProps.getProperties();
  
  var pageToken = null;
  var pageSize = 1500; 

  do {
    var options = {
      personFields: "names,emailAddresses,phoneNumbers,metadata",
      pageSize: pageSize
    };
    if (pageToken) {
      options.pageToken = pageToken;
    }

    var response = People.People.Connections.list("people/me", options);

    if (response.connections && response.connections.length > 0) {
      response.connections.forEach(function(person) {
        var resourceName = person.resourceName;
        var updateTime = person.metadata.sources[0].updateTime;
        var lastUpdateTime = etagsStore[resourceName];

        if (lastUpdateTime !== updateTime) {
          var name = person.names ? person.names[0].displayName : "";
          var email = person.emailAddresses ? person.emailAddresses[0].value : "";
          var phone = person.phoneNumbers ? person.phoneNumbers[0].value : "";
          var etag = person.etag || (person.metadata.sources[0].etag || "");

          var payload = {
            resourceName: resourceName,
            name: name,
            email: email,
            phone: phone,
            updated: updateTime
          };
			//ССЫЛКА ДЛЯ webhook
          UrlFetchApp.fetch("https://ep.morekit.io/xxxxxxxxxxxxxxxxxxxxxxxxx", {
            method: "post",
            contentType: "application/json",
            payload: JSON.stringify(payload)
          });

          scriptProps.setProperty(resourceName, updateTime);
        }
      });
    }

    pageToken = response.nextPageToken;
  } while (pageToken);
}

Init_sync.gs

function initSync() {
  var people = People.People.Connections.list('people/me', {
    personFields: "names,emailAddresses,phoneNumbers"
  });

  if (people.nextSyncToken) {
    PropertiesService.getScriptProperties().setProperty("syncToken", people.nextSyncToken);
  }
}

Результат

Теперь необходимо установить сервис People, чтобы у скрипта был доступ к контактам

Нажимаем + напротив вкладки с сервисами и ищем Peopleapi

Когда сервис добавится — можем выполнить развертывание скриптов, чтобы они начали работать

Нажимаем Начать развертывание —> новое развертывание

Обязательно поставьте доступ Все, иначе скрипт не сможем выгрузить контакты аккаунта из-за ограничения по правам доступа

После успешного выполнения развертывания — переходим в init_sync и нажимаем Выполнить для создания токена синхронизации

Теперь переходим в checkUpdates и также нажимаем Выполнить

После этого действия — в MoreKIT придут события по текущим контактам в google people.

Было создано 3 контакта — пришло 3 события

Чтобы проверить — что все работает корректно — после получения событий измените или создайте контакт в google, должно будет придти 1 событие только по нему

Обновим контакт и снова нажмем на Выполнить в checkUpdates.gs

Видим, что пришло 1 событие

После того, как убедились, что данные приходят и ошибок в процессе нет — настроим триггер на стороне google для автоматического запуска скрипта

Настройка триггера автоматической отправки

В Google переходим в раздел Триггеры

Нажимаем Добавить триггер

Настройки должны быть:

  • Функция — checkUpdates
  • Развертывание — основное
  • Источник мероприятия — триггер по времени
  • Тип триггера — по минутам
  • Промежуток времени в минутах — раз в 5 минут (если у вас платный тариф в google — можно поставить раз в минуту, тогда данные будут уходить быстрее)

Сохраняем триггер

Теперь триггер будет запускаться раз в 5 минут, проверять добавление или изменение новых контактов и отправлять данные в MoreKIT

Можно приступать к настройке процесса передачи в обратную сторону

Из Bitrix24 в Google contacts

Создаем в MoreKIT новый процесс, тип процесса нужно выбрать Битрикс24 вебхук

После создания процесса — копируем ссылку из первоначального блока и переходим в Bitrix24 и для установки хука на изменение и создание контакта

В битрикс24 перейдите в раздел Разработчикам —> Другое —> Исходящий вебхук

Вставляем ссылку на процесс в MoreKIT и выбираем нужные события — создание и изменение контакта

После этого — на процесс MoreKIT начнут приходить события по созданию/изменению контакта из Bitrix24

Второй процесс. Из Bitrix24 —> GooglePeople

Процесс в MoreKIT будет выглядеть следующим образом

Описание блоков схемы

#15 Найти контакты — получаем полные данные контакта по id контакта из входящих данных

#16 Проверка — проверяем, заполнено ли поле ID ресурса в карточке контакта. Данная проверка будет разделять схему на две логические ветви создания и обновления контакта

#18 Получить контакт — получаем полные данные контакта из google people для получения актуального персонального тега (etag)

#22 Регулярные выражения — чистим номер телефона от лишних символов

#17 Обновить контакт — обновляем контакт в google

#19 Проверка — проверяем входящее событие хука от битрикс, если произошло создание контакта

#20 Создать контакт — создаем контакт на стороне Google с заполнением нужных данных контакта

#21 Редактировать контакт — записываем в карточку контакта Bitrix24 поле ID ресурса

Тестируем процесс

Создадим контакт в Битрикс24

В google видим, что контакт создался

Изменим этот контакт в битрикс

Видим, что email поменялся

Подводим итоги

В данном кейсе рассмотрели — как сделать синхронизацию контактов между Bitrix24 и Google Contacts. Настроили скрипты в AppScript на стороне Google и выстроили логические схемы в MoreKIT