Найти в Дзене
Marketing in Life

Как я ускорил процесс отправки курьеров в 5 раз. Неочевидное скрещивание Гугла с Яндексом.

Оглавление

Для блога Shnobell.blog
Для блога Shnobell.blog

Доставка решает

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

Ко мне обратилась компания, которая продавала товар с доставкой не просто день-в-день, у них был заявлен срок доставки заказа по Москве от 40 минут, а заказы у них были.

Для блога Shnobell.blog
Для блога Shnobell.blog

Представьте себе, в течение часа компания получает, допустим, 15 заказов и, пока товар готовится к отправке, нужно успеть определиться с тем, какие из этих заказов рядом, чтобы отдать их одному курьеру, распределить их очередность, чтобы курьер оказался по нужному адресу в согласованное с клиентом время и не забыть ему вручить карточку с данными о заказе, чтобы курьер мог быстро увидеть детали заказа, комментарии к нему, адрес, время и какой товар вообще отдавать клиенту. И так весь день, с утра до самого вечера. Сложно? Лично мне это кажется очень серьезным испытанием. Тем более, что логистику я пока так и не смог хоть как-то понять. Программировать я научиться смог, понял логику и мне это перестало казаться магией, а вот логистика на тот момент не укладывалась ни в какие известные мне алгоритмы решения задач и была белым пятном (скорее даже черным) в моём кругозоре.

Карточки для курьеров

Немного остановимся на том, что из себя представляют эти самые карточки для курьеров с данными о заказе (маршрутные листы). Это простой лист А4, на котором указаны:

  • Время;
  • Товар;
  • Комментарии;
  • Контакты для связи с получателем;
  • Данные о способе и сумме оплаты;
  • Другие технические детали.

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

Процесс в исходном виде

Для блога Shnobell.blog
Для блога Shnobell.blog

А теперь, о том, как эти карточки формировались.

Все достаточно просто и банально - руками и классическим копипастом из Google таблицы в шаблонный бланк. Дополнительно копировался адрес в Яндекс карты, иногда уточнялся, так как не всегда он был понятен картам. Масштаб на карте подгонялся так, чтобы было видно и адрес, и ближайшее метро, а затем уже выводился на печать.

С учетом количества фрагментов данных, которые нужно было перенести в бланк, и печати самой карты, количество простых, абсолютно механических действий начиналось от 12 кликов и переключений между вкладками. Беря во внимание суету, в которой все это происходит, необходимость размышлять о том, какому из курьеров отдать конкретный заказ, успеют ли заказ подготовить к выходу курьера и других моментах (о чем там еще думают логисты?) - становится ясно, что вероятность совершения простой механической ошибки достаточно высока.

Для блога Shnobell.blog
Для блога Shnobell.blog

Отдельным пунктом этой увлекательной истории следует отметить упорство и старательность сотрудников, которые это делали. И делали достаточно давно, более 7 лет. Честно, мне кажется, я бы сдулся и изменил свое позитивное отношение к жизни до конца первого года подобного труда.

Исправляем ситуацию

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

Для блога Shnobell.blog
Для блога Shnobell.blog

Спойлер: вот тут можно поиграться с результатом, но лучше с компьютера

И так, цель мы сформулировали следующую: “Ускорить процесс назначения и отправки курьеров”, естественно, без ущерба качеству самой логистики. А задачи звучали буквально так (цитирую): “Нам нужно быстро, в идеале одной кнопкой, печатать бланк заказа для курьера и карту, чтобы на ней был виден сам адрес и ближайшее метро”. В целом все понятно, в частности - не очень. Пришлось задать полтора уточняющих вопроса, и в итоге получилось составить список, с которым уже можно открывать редактор и приниматься за разработку.

А теперь о том, что нужно было сделать, исходя из поставленной цели:

  1. Составить шаблон бланка с необходимыми курьеру данными о заказе и картой.
  2. Реализовать автоматический перенос данных о заказе из таблицы в этот шаблон.
  3. В бланке отобразить карту Яндекс, в центре которой бы отображались точка доставки и ближайшее к ней метро. Точку доставки обозначить меткой с подписью, в подписи продублировать адрес, а ближайшее метро обозначить меткой с буквой “М”. Предусмотреть возможность “подвигать” карту и изменить масштаб, чтобы при необходимости, вручную скорректировать отображение.
  4. Под картой разместить текстовое поле для ввода адреса с подсказками и кнопку, при нажатии на которую бы карта перемещалась на новый адрес и метро. В поле для адреса по умолчанию показывать текущий адрес, который указан в таблице и по которому центрирована карта. Эти элементы на печать не выводить.
  5. В особых случаях, при соблюдении конкретных условий - в шапке бланка отобразить изображение.
  6. Отобразить кнопку “печать”, при нажатии на которую бланк будет отправляться на печать. Кнопку на печать не выводить.
  7. Автоматически заливать строки в таблице с заказами, для которых бланк уже распечатан.
  8. Запускать процесс в минимальное количество действий, и обязательно из таблицы с заказами.

Если бы нужно было просто перенести данные из таблицы в шаблон и расставить по своим местам - задача была бы совсем тривиальной, неинтересной и даже скучной. Однако, необходимость приручить принтер и карты Яндекса из таблицы Гугла, обойти ограничения таблиц по размещению кнопок (я хотел запускать процесс прямо из строки с заказом), бросала мне вызов и добавляла азарта. Принимая во внимание желание вырвать людей из лап той монотонной скукотищи, которой занимался заказчик - мотивацию можно было считать железобетонной.

Реализация решения для курьеров

Забегая немного вперед, скажу, что не со всеми поставленными задачами мне удалось справиться именно так, как я рассчитывал. Поэтому, если я упустил какое-то решение или вы просто знаете его - попрошу поделиться в комментариях.

В качестве среды, в которой будет выполняться, обрабатываться и отображаться приложение я выбрал гугл скрипты, решил воспользоваться возможностью развертывания web-app. Этот способ позволяет обработать входящий запрос и отдать нужный ответ. Такая “облачная функция” на минималках. В данном случае скрипт в ответ отдавал веб-страницу, на которой я с помощью HTML и ванильного JavaScript расставлял по нужным местам шаблона данные, а с помощью API Яндекс карт находил координаты адреса, ближайшее метро и строил карту с ними.

Для блога Shnobell.blog
Для блога Shnobell.blog

А вот с печатью мне пришлось повозиться. При нажатии на кнопку “напечатать”, я настроил заливку строки в таблице и скрытие ненужных курьеру полей и кнопок. Проблема возникла в том, что у меня никак не получилось обойти вызов диалогового окна печати. С какой стороны я не заходил, как не игрался с настройками браузера, печать по кнопке на странице реализовать не удалось и получилось одно лишнее движение - нужно подтверждать отправку на печать. Поэтому, если вдруг кто-то знает способ - дайте знать, пожалуйста, а то я плохо сплю.

Для запуска я решил отказаться от кнопок в таблице и использования меню. Просто добавил столбец с функцией ГИПЕРССЫЛКА() в массиве, заполнил его. В качестве текста ссылки использовал эмоджи с машинкой (доставка же), а в качестве адреса - ссылку на развернутое веб-приложение и номер заказа в параметрах. Мне кажется получилось гениально и, кроме того, еще и быстро. Во-первых - это быстрее, чем запускать скрипт через клик на картинке, ждать выполнения скрипта и перенаправлять пользователя на еще один скрипт, а во-вторых - не нужно выходить за пределы строки с заказом.

*Формулу пришлось немного сократить, чтобы она влезла в скриншот
*Формулу пришлось немного сократить, чтобы она влезла в скриншот
*А вот так выглядит заполненная строка в таблице
*А вот так выглядит заполненная строка в таблице

Получился следующий процесс: клик по ссылке у машинки рядом с адресом => открытие новой вкладки с бланком => исправление адреса или карты при необходимости => клик на кнопку “печать” и подтверждение печати. Всего 4 действия и примерно 3-5 секунд, вместо минимум 30 секунд, которые тратили раньше на перенос данных и переключения между вкладками.

Для блога Shnobell.blog
Для блога Shnobell.blog

Заключение

Подводя итог, хочу заметить что подобные не сильно громоздкие, но очень вязкие процессы встречаются очень часто. Бывает, что причиной является привычка из разряда “всегда так делали” и замыленный взгляд, а бывает и незнание доступных способов автоматизации. Конечно, подобное становится заметным, когда проблема принимает большой масштаб и количество затрачиваемых сил поднимает приоритет необходимости оптимизации на заметный уровень, но если автоматизацию проводить чуть раньше - это ощутимо сказывается на количестве свободных ресурсов и, как следствие, на развитии бизнеса.