В данной статье рассмотрим, как можно синхронизировать контакты между 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— будет проверять новый созданный/обновленный контакт и отправлять его в MoreKITinit_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