В этой статье я расскажу вам об очень простом способе использования Google Sheet+Google AppScript для сбора данных с веб-хука. Вы также можете погрузиться в код этой таблицы, которую я сделал специально для вас:*

Некоторый контекст — наш рабочий процесс поддержки

Недавно я хотел использовать Google Spreadsheet, чтобы регистрировать обработку обращений в службу поддержки и время их решения.

В работе используем Talkus в сочетании со Slack:

  1. Кому-то из команды Toucan нужна техническая помощь
  2. Открывают тикет командой /talkus_new_ticket help pls и создается временный канал (обычно #z-silly-name)
  3. Наш король или королева недели (=назначенная еженедельная команда технической поддержки, см. этот доклад сделан на техническом обеде @Algolia) может ответить и решить проблему.
  4. Когда проблема решена, временный канал закрывается

** Внимание — доступны уже готовые инструменты **

Стоит отметить, что 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

  1. Создать таблицу Google
  2. В электронной таблице откройте редактор сценариев: Tools > Script Editor...
  3. ???
  4. Выгода!

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

function testRun() {
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow(['some', 'fake', 'data']);
}
  1. Сохраните (cmd+S) и введите название проекта при появлении запроса.
  2. В меню редактора скриптов перейдите к 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 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”, “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' › Бот Talkus
  • userName == 'Toucan Tech support' › Обычно автоматический ответ от Talkus

Визуализируйте свои данные

В этой части я использовал наше собственное приложение Toucan, чтобы легко подключиться к электронной таблице и визуализировать время обработки. Вы можете связаться с нашим отделом продаж для получения дополнительной информации или воспользоваться некоторыми бесплатными онлайн-инструментами.

Имея данные как есть, я добавил небольшой скрипт на python/pandas для вычисления временных дельт, это очень просто :) Вот полезные строки для преобразования временных строк

Теперь немного смешного, а именно:

Почему смешно? Поскольку скрипт работает уже неделю, поэтому точек данных не так много, поэтому 1 сверхдлинный билет сломает счет. Кроме того, заявки, созданные в нерабочее время, имеют более длительное время обработки, возможно, это может быть учтено в следующей итерации скрипта. Я сделаю продолжение, когда у нас будет больше данных :)

Я уже обнаружил здесь, что иногда наша команда технической поддержки присоединяется к каналу, но не пишет, чтобы указать, что они работают над проблемой: это значительно увеличивает измеренное время обработки. Это согласуется с нашим качественным анализом рабочего процесса поддержки Toucan, который намекнул на необходимость раннего сообщения о проблеме, даже простого признания проблемы. Таким образом, похоже, что наблюдение за этой метрикой должно привести к интересным результатам!

Надеюсь, это поможет, получайте удовольствие от сбора данных;)

Первоначально опубликовано Sophie Despeisse на https://toucantoco.com 15 февраля 2018 г.