В этой статье я расскажу вам об очень простом способе использования Google Sheet+Google AppScript для сбора данных с веб-хука. Вы также можете погрузиться в код этой таблицы, которую я сделал специально для вас:*
Некоторый контекст — наш рабочий процесс поддержки
Недавно я хотел использовать Google Spreadsheet, чтобы регистрировать обработку обращений в службу поддержки и время их решения.
В работе используем Talkus в сочетании со Slack:
- Кому-то из команды Toucan нужна техническая помощь
- Открывают тикет командой
/talkus_new_ticket help pls
и создается временный канал (обычно#z-silly-name
) - Наш король или королева недели (=назначенная еженедельная команда технической поддержки, см. этот доклад сделан на техническом обеде @Algolia) может ответить и решить проблему.
- Когда проблема решена, временный канал закрывается
** Внимание — доступны уже готовые инструменты **
Стоит отметить, что Talkus предлагает функцию отчетности, но, поскольку все наши пользователи Talkus входят в одну и ту же команду Toucan slack, время обработки было неправильным (человек, обратившийся за помощью, засчитывался как ответивший).
Кроме того, у Zapier есть рецепт только для веб-перехватчиков и Google Таблиц (но в чем прикол :p)
Давай сделаем это
Зе план
Я прикинул, что мне понадобится:
- веб-приложение Google, которое может получать POST-запросы с некоторыми данными
- записать эти данные в электронную таблицу
- настроить Talkus таким образом, чтобы для каждого нового билета/события в мое веб-приложение Google отправлялся POST
- Подключите эту таблицу к приложению для визуализации данных Toucan Toco (для этого шага, пожалуйста, свяжитесь с одним из наших торговых представителей;))
Довольно просто :) Сначала мне нужно проверить, как работает каждый элемент, а затем я соберу кирпичики.
Добавление строки в Google Sheet
Из документации: https://developers.google.com/apps-script/guides/sheets#writing_data
- Создать таблицу Google
- В электронной таблице откройте редактор сценариев:
Tools > Script Editor...
- ???
- Выгода!
В редакторе скриптов я добавил очень простую функцию, чтобы посмотреть, все ли работает как положено.
function testRun() {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.appendRow(['some', 'fake', 'data']);
}
- Сохраните (cmd+S) и введите название проекта при появлении запроса.
- В меню редактора скриптов перейдите к
Run > Run function... > testRun
Google Script попросит вас разрешить скрипту писать в электронной таблице, сделайте это.
Тадаа… сработало, строка добавилась!
Это было просто! Теперь давайте превратим этот скрипт в веб-приложение, чтобы оно могло обрабатывать запросы.
Обработка POST-запросов
Из документации видно, что веб-приложения Google могут отвечать на запросы POST. РТФМ:
Добавьте метод doPost
Веб-приложение может обрабатывать запросы GET и POST, используя методы doPost
и doGet
. Давайте попробуем это с помощью очень простых методов:
function doPost(e) {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.appendRow(['post test']);
}
function doGet(e) {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.appendRow(['get test']);
}
Опубликуйте свое веб-приложение
В редакторе скриптов перейдите на Publish > Deploy as Web App
Я выбрал :
- чтобы выполнить приложение как «Я»
- У кого есть доступ к приложению «Все, даже анонимные»
Перейдите к разделу "Устранение неполадок" ниже, если вы не видите вариант "Все, даже анонимные".
После нажатия кнопки развертывания мне был предоставлен URL-адрес скрипта: https://script.google.com/macros/s/XXXXXX-YYYYYYY/exec.
Если вы обращаетесь к нему из своего браузера, ваша функция doGet
должна быть выполнена (попробуйте!).
Почта
Хотя здесь это кажется довольно простым, на самом деле работа с POST заняла у меня больше всего времени. В документации Google я продолжал читать о недоступных мне опциях. Сначала я отмахнулся от этого как от перевода (документ был на английском, мой интерфейс был на французском). Оказывается, я использовал корпоративную учетную запись Google App и входил в несколько учетных записей одновременно, каждая из которых вызывала свой собственный набор проблем :). Мне потребовалось некоторое время, чтобы разобраться, поэтому я добавил раздел "Устранение неполадок".
Я хочу посмотреть, как мое приложение отреагирует на POST. Поэтому я делаю простой пост CURL:
curl -X POST https://script.google.com/macros/s/xxx-YYY/exec
Добавим данные:
curl -d '{"test":"supertest", "test2":"supertest2"}' -H "Content-Type: application/json" -X POST https://script.google.com/macros/s/xxx-YYY/exec
Чтобы проверить это, я изменил свой код:
function doPost(e) {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.appendRow([e.postData.contents]);
}
Затем я повторно опубликовал свое приложение:
Будьте осторожны, чтобы выбрать вариант «Новая» версия в раскрывающемся списке.
Обратите внимание, что использование URL-адреса
/dev
(найденного, если вы перейдете по последней ссылке кода) не работает для POST, поэтому для каждого изменения, которое вы вносите в свое сообщение, вам необходимо опубликовать новую версию.
Тадаа! Результат виден в таблице!
Исправление проблем…
В этот момент, когда я исследовал, я застопорился, потому что разрешения моего сценария и электронной таблицы были ограничены. Это связано с тем, что я делал все это из корпоративной учетной записи GSuite. Чтобы это работало, у вас должна быть возможность публиковать документы для всех в Интернете. Если вы являетесь администратором Google для домена, вы можете включить это. Я лично решил создать электронную таблицу из своей собственной учетной записи потребителя, потому что не хотел снижать настройки безопасности всех наших Google Apps.
При попытке получить доступ к скрипту из браузера меня встретила ошибка Страница не найдена… Оказывается, поскольку я вошел в систему с несколькими учетными записями Google, указанный URL-адрес был неверным: https://script.google.com/macros/u/0/s/XXXXXX-YYYYYYY/exec
вместо https://script.google.com/macros/s/XXXXXX-YYYYYYY/exec
(ср. проблема на StackOverflow )
Чтобы это исправить, вам нужно удалить /u/x
часть URL-адреса, чтобы протестировать скрипт, например: https://script.google.com/macros/s/XXXXXX-YYYYYYY/exec.
Обычно это означает, что права доступа к указанному ресурсу установлены неправильно.
Давайте соберем данные
С Talkus WebHook
Здесь моя цель — использовать электронную таблицу Google в качестве базы данных для данных билетов Talkus.
В приложении Talkus в меню «Интеграция» я просто скопировал и вставил URL-адрес своего скрипта и нажал кнопку «Отправить тестовое сообщение на ваш веб-хук».
Теперь я вижу, что форма содержимого postData такова:
Контент от Talkus Webhook test ``` [ { «event»: «start», «createdAt»: «2017–02–16T16:21:12.895Z», «channelName»: «z-denholm-reynholm», «visitorName» : «Denholm Reynholm», «visitorId»: «AP3qSeAG7d5uTAacH», «identity»: { «userAgent»: «Mozilla\/5.0 (Macintosh; Intel Mac OS X 10
curl -X POST https://script.google.com/macros/s/xxx-YYY/exec
1) AppleWebKit\/527.36 (KHTML, например, Gecko) Chrome\/ 55.0.2883.95 Safari\/537.36», «местоположение»: «http://reynholm.talkus.io\/», «id»: «U0AFE3Z12», «имя»: «den», «visitorId»: « AP3qSeAG7d5uTAacH», «ip»: «98.189.242.66», «email»: «[email protected]», «языки»: «en», «название»: «Talkus Admin» }, «appId»: « oKJJXAsT5PprBAQ7W», «messages»: [ { «userName»: «Denholm Reynholm», «text»: «Где милая девушка с 5-го этажа?», «userPicture»: «\/\/vignette1.wikia.nocookie. net\/theitcrowd\/images\/0\/0b\/Denholm_declares_war.jpg\/revision\/latest?cb=20100425163116", "createdAt": "2017–01–18T15:42:11.000Z" } ], " сообщение»: «Денхольм Рейнхольм: Где милая девушка с 5-го этажа?» }, (…) { «event»: «end», «createdAt»: «2017–02–16T16:49:12.995Z», «channelName»: «z-denholm-reynholm», «visitorName»: «Denholm Reynholm ", "visitorId": "AP3qSeAG7d5uTAacH", "identity": { "userAgent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10curl -X POST https://script.google.com/macros/s/xxx-YYY/exec
1) AppleWebKit\/527.36 (KHTML, например Gecko) Chrome\/55.0.2883.95 Safari \/537.36», «местоположение»: «http:\/\/reynholm.talkus.io\/», «id»: «U0AFE3Z12», «имя»: «den», «visitorId»: «AP3qSeAG7d5uTAacH», « ip”: “98.189.242.66”, “email”: “[email protected]”, “языки”: “en”, “title”: “Talkus Admin” }, “appId”: “oKJJXAsT5PprBAQ7W”, “ messages”: [ { “userName”: “Denholm Reynholm”, “text”: “Где милая девушка с 5-го этажа?”, “userPicture”: “\/\/vignette1.wikia.nocookie.net\/theitcrowd \/images\/0\/0b\/Denholm_declares_war.jpg\/revision\/latest?cb=20100425163116", "createdAt": "2017–01–18T15:42:11.000Z" }, { "userName": " Рой», «текст»: «В столовой, на 4-м этаже», «userPicture»: «\/\/vignette2.wikia.nocookie.net\/theitcrowd\/images\/9\/9e\ /Roy2.jpg\/revision\/latest\/масштабирование по ширине вниз\/250?cb=20090403154035", "createdAt": "2017–01–18T15:53:23.000Z" } ], "message" : «Денхольм Рейнхольм: Где милая девушка с 5-го этажа?\nРой: В столовой, на 4-м этаже». } ] ```
Фактический код
Я провел несколько тестов, создав тикеты в slack, и решил, что мне нужно будет регистрировать только end
событий, потому что они содержат всю необходимую информацию. Мне понадобится :
- дата события
end
(полеcreatedAt
) - анализировать сообщения и получать
— Имя первого пользователя, который разговаривает в канале + время сообщения, › это пользователь, обращающийся за поддержкой
— Имя второго пользователя для разговора в канале + время сообщения, › на которое отвечает пользователь
Я также исключил из своего поиска пользователей с:
userName == 'slackbot'
› Обычно автоматический ответ на выражения.userPicture == 'https://talkus.io/app/avatar-default.png'
› Бот TalkususerName == 'Toucan Tech support'
› Обычно автоматический ответ от Talkus
Визуализируйте свои данные
В этой части я использовал наше собственное приложение Toucan, чтобы легко подключиться к электронной таблице и визуализировать время обработки. Вы можете связаться с нашим отделом продаж для получения дополнительной информации или воспользоваться некоторыми бесплатными онлайн-инструментами.
Имея данные как есть, я добавил небольшой скрипт на python/pandas для вычисления временных дельт, это очень просто :) Вот полезные строки для преобразования временных строк
Теперь немного смешного, а именно:
Почему смешно? Поскольку скрипт работает уже неделю, поэтому точек данных не так много, поэтому 1 сверхдлинный билет сломает счет. Кроме того, заявки, созданные в нерабочее время, имеют более длительное время обработки, возможно, это может быть учтено в следующей итерации скрипта. Я сделаю продолжение, когда у нас будет больше данных :)
Я уже обнаружил здесь, что иногда наша команда технической поддержки присоединяется к каналу, но не пишет, чтобы указать, что они работают над проблемой: это значительно увеличивает измеренное время обработки. Это согласуется с нашим качественным анализом рабочего процесса поддержки Toucan, который намекнул на необходимость раннего сообщения о проблеме, даже простого признания проблемы. Таким образом, похоже, что наблюдение за этой метрикой должно привести к интересным результатам!
Надеюсь, это поможет, получайте удовольствие от сбора данных;)
Первоначально опубликовано Sophie Despeisse на https://toucantoco.com 15 февраля 2018 г.