Заполнение таблицы Google Sheet по данным из внешней системы


В качестве внешней системы в данном примере будет использоваться amoCRM .

Подготовка таблицы

Создадим таблицу на Google Drive и заполним заголовки.

Добавим скрипт, который будет заполнять таблицу (Расширения → Apps Script):

Настройка Apps Script

Заполним содержимое простым скриптом приёма данных и дадим скрипту название (полезно, если таких скриптов несколько, при наличии сбоев можно будет определить источник).

Код для вставки:

function doPost(request) {
let data = JSON.parse(request.postData.contents);
let keys = Object.keys(data);
let active_sheet = SpreadsheetApp.getActiveSheet();
let last_row = active_sheet.getLastRow();
let new_row = [];
keys.sort();
keys.forEach((value) => {new_row.push(typeof(data[value]) == "object" && data[value] ? data[value].join(',') : data[value])});
if (!new_row || !new_row.length) return;
active_sheet.getRange(last_row + 1, 1, 1, new_row.length).setValues([new_row]);
return ContentService.createTextOutput('ok');
}

Итог:

После чего нажимаем “Начать развертывание” → “Новое развёртывание”.

Выбираем тип “Веб-приложение”:

Заполняем форму:

  • Описание — что угодно для удобства вашей работы;
  • Запуск от имени — от моего имени;
  • У кого есть доступ — все (не стоит бояться этой опции, т.к. в нашем скрипте мы только принимаем данные и никакого содержимого таблицы не показываем);

После развертывания приложения копируем ссылку на него:

ВНИМАНИЕ: скрипты могут дорабатываться практически без ограничений, убедитесь что вы доверяете его создателю, т.к. при запуске скрипт получает полный доступ к вашему диску, а не только к файлу, к которому он приложен.

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

Создадим процесс с источником “amoCRM → Вебхук”.

Добавим блоки:

  • Дата и время
  • Найти сделки
  • Найти контакты
  • WebHook

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

Непосредственно к заполнению таблицы относится только последняя функция, все предыдущие блоки только собирают для неё данные.

Старт

Проверяем что нам пришла сделка через равенство {{сущность}} = Сделка

Дата и время

Создаём дату с текущим временем, чтобы отметить в таблице

Для этого:

  • отмечаем “Сейчас”
  • в поле “В формат” выбираем:
    тип — “в формат”
    формат — %Y.%m.%d %H:%M

Подробнее форматы описаны на странице Дата и время.

Найти сделки

Находим сделку по id, заполнив поля “Поиск по”:
значение — {{ID}} (из входящих данных хука)
поле — ID

Как видно — мы не обрабатываем действия, если сделка не найдена, т.к. считаем что в таком случае она не нужна нам в таблице.

Найти контакты

Находим контакт из сделки:

  • выбрать — “Самый старый”
  • из сделки/компании — {{#5}}

Аналогично сделке, если контакт не найден — мы не обрабатываем логику и заканчиваем работу события.

WebHook

Отправляем WebHook на скопированный ранее адрес и заполняем его параметры:

  • Игнорировать ошибку таймаута — обработка сервисов гугл иногда может занимать несколько секунд, эта опция отключит повторные отправки чтобы не дублировались данные в таблице;
  • POST-параметр:
    ключ — 1
    значение — {{#4.дата}}
  • POST-параметр:
    ключ — 2
    значение — {{#2.Название}}
  • POST-параметр:
    ключ — 3
    значение — {{#5.Бюджет}}
  • POST-параметр:
    ключ — 4
    значение — {{#5.Исполнитель}}

Ключи можно указывать в любом порядке, скрипт, который мы ранее создали в таблице, отсортирует их по возрастанию. Таким образом, если какое-то поле не будет заполнено — соответствующая ячейка также будет пропущена.

Итог

После создания сделки с контактом в интерфейсе amoCRM у нас создаётся событие в логе:

И добавляется строка в таблицу от имени того, кто размещал скрипт на стороне Google: