Передаем негативных клиентов в google sheets с помощью Chatrex и MoreKit
В данной статье рассмотрим следующий кейс: необходимо передать данные из CRM в google sheets (id сделки, имя клиента, имя ответственного), если клиент проявил негатив в общении с менеджером
Для данной реализации будет задан соответствующий промпт в ИИ бота на стороне Chatrex
Настройка бота
Настраиваем боту соответствующий промпт, при котором бот отправит webhook на адрес MoreKit с соответствующими данными, если клиент написал негативное сообщение по заданным условиям промпта.
В Chatrex, в системном промте стоит описать, кем является бот, как он должен общаться (официально, дружественно, и т.п.), а также какой цели он придерживается. Данный блок является крайне важным и эффективность работы чат-бота напрямую зависит от указанного системного промта.

В вкладке “Условия срабатывания” — мы можем указать параметры при которых текущий бот будет работать, дни недели, время (с указанием часового пояса) и условия запуска.
Для начала необходимо выбрать каналы общения, для этого — нажмите на шестеренку, и выберите необходимые каналы в которых будет общаться чат-бот. После чего нажмите кнопку “сохранить”

Далее необходимо выбрать условия запуска бота. Например, при интеграции с каналом amoCRM, можно выбрать в каких воронках и в каких статусах сделки будет работать бот. Условия можно комбинировать, например чат-бот будет работать в воронке “Продажи”, на всех этапах, но только с теми сделками, в которых наше кастомное поле “Статус клиента” равно значению ‘VIP’
Раздел “Свои переменные” — необходим для того, чтобы бот записывал данные от клиента, которые получает во время диалога. Для этого укажите название самой переменной (обязательно на английском) и понятное пояснение для бота что это за переменная. Например нам необходимо чтобы в рамках диалога бот выяснял номер клиента и указывал его в карточке контакта amoCRM.
Создание таблицы google sheets
На данном шаге необходимо создать google таблицу, развернув на ней скрипт обработчик. Копируем скрипт и выполняем новое развертывание по данной документации
Скрипт-обработчик для appscript будет следующий
function doPost(request) {
var data = JSON.parse(request.postData.contents),
sheet = SpreadsheetApp.getActive().getActiveSheet(),
table_headers = get_table_headers(sheet),
search_by = request.parameter.search_by;
if (table_headers.length == 0) {
table_headers = Object.keys(data);
fill_headers(sheet, table_headers);
}
if (!search_by) {
return ContentService.createTextOutput(JSON.stringify({
'error': 'search_by not found'
}));
}
if (is_object(data)) {
var fill_func = fill_object;
if (is_array(data)) fill_func = fill_array;
fill_func(data, table_headers, sheet, search_by);
} else {
return ContentService.createTextOutput(JSON.stringify({
'error': 'Unknown data format'
}));
}
return ContentService.createTextOutput(JSON.stringify({
'result': 'ok'
}));
}
function is_array(data) {
return typeof(data) === 'object' && data.length;
}
function is_object(data) {
return typeof(data) === 'object';
}
function fill_array(data, table_headers, sheet, search_by) {
data.forEach((v) => {
fill_object(v, table_headers, sheet, search_by)
});
}
function fill_object(data, table_headers, sheet, search_by) {
var column_id = table_headers.indexOf(search_by);
if (column_id < 0) return;
var row = get_row_id_by_lead_id(data[search_by], column_id + 1, sheet),
data = object_to_list(data, table_headers);
sheet.getRange(row, 1, 1, data.length).setValues([data]);
}
function fill_headers(sheet, headers) {
sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
}
function get_table_headers(sheet) {
var cols = sheet.getLastColumn();
if (cols > 0)
return sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
else
return [];
}
function object_to_list(data, table_headers){
var result = [];
for (var i in table_headers){
var is_null = data[table_headers[i]] === undefined || data[table_headers[i]] === null;
result.push(is_null ? '' : data[table_headers[i]]);
}
return result;
}
function get_row_id_by_lead_id(lead_id, column, sheet) {
var last_row = sheet.getLastRow();
if (last_row > 1) {
var data = sheet.getRange(2, column, last_row, 1).getValues();
for (i in data) {
if (data[i] && data[i][0] == lead_id) return parseInt(i) + 2;
}
}
return parseInt(last_row) + 1;
}После вставки скрипта и его развертки на таблицу — отправленные на таблицу данные будут заполняться в таблицу
Настройка процесса в MoreKit
Теперь необходимо создать процесс в MoreKit, выбираем нужный тип, в нашем случае тип процесса будет «Другое»

Выстраиваем схему следующим образом

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

#1 Регулярные выражения — используется для очистки номера телефона от лишних символов (пробелов, скобок, операторов)

#2 Найти контакты — ищем контакт по очищенному номеру телефона

#3 — ищем контакт по email адресу, если не нашли по телефону

#5 Создать контакт — создаем новый контакт, если не сработал поиск по email и номеру телефона

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

#7 Найти сделки — ищем активную сделку из контакта. В данном блоке используем фильтр по статусу, отсекая поиск сделок в закрытых статусах, чтобы результатом поиска была активная сделка

#8 Создать сделку — Создаем новую сделку, если не нашли активную сделку из контакта, заполняем название сделки, статус, прикрепляем контакт

#9 Создать переменную — записываем найденную/созданную сделку в переменную

#10 HTTP запрос — отправляем HTTP запрос в нашу google таблицу. В данном блоке URL — генерируемый url после разворачивания скрипта. Добавляем один GET параметр search_by, чтобы не было дублей строк в таблице, при отправке автоматически найдется строка с ID сделки, который будет передаваться. Если сделка в таблице не найдется — создастся новая строка. POST параметры — параметры, необходимые для заполнения в таблицу: Имя, Номер, Email, Сообщение, ID сделки
Проверяем результат
Ждем сообщения от бота. Как только поступит негативное сообщение — произойдет отправка webhook со стороны Chatrex в Morekit. В процессе данные обработаются и отправятся в таблицу.

Подводим итоги
В данной статье разобрали, как передать информацию о клиенте, который оставил негативное сообщение с помощью отправки запроса из Chatrex в MoreKit. MoreKit собрал данные внутри процесса и успешно передал их в google таблицу