Интернет магазин в чатботе с товарами из гугл таблицы

Готовый интернет магазин с корзиной и списком товаров в Google таблице.

Вы можете установить этот проект прямо из шаблона. Данная статья рассказывает, как этот шаблон работает.

Инструкция по работе с функцией магазина

адрес функции: https://store.salebot.pro/function/shop

1.Таблица

Подготавливаем таблицу для работы с функцией магазина, желтым цветом выделен id таблицы, он понадобится нам позже: https://docs.google.com/spreadsheets/d/1n6VJwstN5DK37b7ThOZE3-25Z0E5H-uo3VgiwKxTg5w/

Таблица должна состоять, минимум из 4 обязательных столбцов с такими названиями: Категория Подкатегория Товар и Цена (без лишних пробелов и абзацев). Тогда почему в примере таблицы их больше? Узнаете дальше, пункт 2.1. Внимание: Не важно в каком порядке расположены эти столбцы, главное чтобы они были и заполнены. Если Категория не имеет подкатегорий, то просто оставьте столбец пустым. Из колонки Товар берутся наименование товаров для вывода списка пользователю и отображения в корзине. Соответственно с колонки Цена берется цена на товар. Цены заполняем целыми числами без копеек, если будут копейки они просто не будут учитываться.

2. Блоки и схема

Общий вид схемы:

Зеленый и красный блоки не обязательны, просто помечены для наглядности. Вход и работа магазина начинается с блока сразу за зеленым и обозначен как Точка входа. В этом блоке удаляются все переменные созданные при работе магазина.

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

Блок - !!!Категории!!!

В теле запроса JSON-POST запроса прописать id своей таблицы с товарами: {"id":"1n6VJwstN5DK37b7ThOZE3-25Z0E5H-uo3VgiwKxTg5w","number_sheet":"#{number_sheet}","with_buttons":"#{with_buttons}","client":"#{client_type}","command":"category","add_number_str":”#{add_number_str}”} Больше в запросе ничего менять не нужно.

Поле Назначение переменных при переходе, имеет 3 переменных: with_buttons = yes currency = руб number_sheet = 1 add_number_str = Введите номер позиции:

Если значение with_buttons = yes, то категории и подкатегории отображаются кнопками (до 15 штук, если больше, то списком), если указать with_buttons = no, то все выводится списком с текстом: Введите номер позиции. Переменной currency присвоить значение валюты (отображается при выводе товаров и корзины, пример 1.Карандаш - 10 руб) В переменную number_sheet передается номер листа в таблице. add_number_str - текст внизу списка категорий, подкатегорий и товаров.

В блоке выше происходит запрос для получения списка категорий для вывода пользователям мессенджеров без кнопок, в том числе фейсбук, или кнопок для мессенджеров с кнопками. Соответственно скрипт возвращает список и кнопки, а в следующем блоке их выводит: #{lists} - список и в поле расширенных настроек кнопок: #{button}. В блоке должны быть обе эти переменные, одну из них вернет скрипт, который контролирует, что отправлять в зависимости от мессенджера.

После выбора категории, переход состоится по стрелке с запоминанием ввода клиента и записью в переменную category, в следующем блоке запрашиваются подкатегории - блок !!!Подкатегории!!! В теле запроса прописать id своей таблицы с товарами, все данные блока на скрине ниже. {"id":"1n6VJwstN5DK37b7ThOZE3-25Z0E5H-uo3VgiwKxTg5w", "number_sheet":"#{number_sheet}","client":"#{client_type}","command":"subcategory", "category":"#{category}","category_list":"#{category_list}","with_buttons":"#{with_buttons}","add_number_str":"#{add_number_str}"}

И возвращает следующее: button->subbutton; - кнопки подкатегорий status -> substatus; - статус обработки ввода пользователя lists -> sublists; - список для отображения вместо кнопок subcategory_list -> subcategory_list; - список подкатегорий (служебный) category -> category - выбранная пользователем категория

Дальше в зависимости от наличия подкатегорий, если их нет, то идет по ветке и выводит товары, если есть - идет по другой и выводит список или кнопки подкатегорий. На стрелках условия с переходом по времени -1: substatus - err - неверный ввод категории, переход в блок Введите корректное значение и следом на выбор категории. substatus - 0 - нет подкатегорий, переход сразу в блок запроса товаров (!!!Товары!!!) substatus - 1 - есть подкатегории, переход к блоку для вывода подкатегорий.

Соответственно запрос выше возвращает список и кнопки, а в следующем блоке их выводит: #{sublists} - список и в поле расширенных настроек кнопок: #{subbutton}. В блоке должны быть обе эти переменные, одну из них вернет скрипт, который контролирует, что отправлять в зависимости от мессенджера.

Блок вывода подкатегорий (скриншот ниже).

После выбора подкатегорий ввод пользователя записывается в переменную subcategory.

Внимание 2 блока - !!!Товары!!!

В один попадаем, если нет подкатегорий, сразу после выбора категории, а во второй - после выбора подкатегории, которую передаем в запросе. В теле запроса прописать id своей таблицы с товарами.

Остальные параметры оставить без изменений, прилагаю:

{"id":"1n6VJwstN5DK37b7ThOZE3-25Z0E5H-uo3VgiwKxTg5w", "number_sheet":"#{number_sheet}","client":"#{client_type}","command":"products", "category":"#{category}","currency":"#{currency}","subcategory":"#{subcategory}","subcategory_list":"#{subcategory_list}","add_number_str":"#{add_number_str}"}

В ответ на запрос получаем: button->pbutton; - кнопки товаров lists -> plists; - список товаров products_list -> products_list; - служебный список товаров, который передаем в следующем блоке prod_list_all -> prod_list_all; - переменная, которая передается в следующем блоке, в которую записываются все данные по товарам subcategory -> subcategory; - если запрос с подкатегорией, то передается название или номер подкатегории в списке status -> pstatus; - проверка ввода пользователя, если все в порядке возвращает 1, если нет, то err. Соответственно это условия на стрелках.

Если запрос успешен, то осуществляется переход в блок с выводом товаров, который для ветки с подкатегорией выводит: #{category} -> #{subcategory}: #{plists} А для ветки без подкатегории: #{category}: #{plists}

category - название категории subcategory - название подкатегории plists - список товаров

2.1 Два необязательных блока

После этого пользователь вводит номер товара и оба блока снова переходят в одну ветку блок !!!О товаре!!!

С него осуществляется запрос на получение всех данных о выбранном товаре. Параметры запроса изменять ничего не нужно: {"command":"cart","currency":"#{currency}","prod_list_all":"#{prod_list_all}","product_num":"#{product_num}","subcategory":"#{subcategory}"} prod_list_all - список товаров с полными данными product_num - сохраненный номер, который ввел пользователь при переходе в этот блок.

Запрос возвращает два обязательных параметра, поле "Сохранение значения из Json-ответа": status -> status; - статус запроса, в том числе проверка ввода данных пользователем subcat -> subcat; - с какой ветки пришел пользователь с подкатегориями (1) или без (0), соответственно при нажатии кнопки назад - по стрелке попадаем в пустой блок из которого две стрелки с условием по этой переменной.

Внимание - запрос в этом блоке возвращает все данные, которые есть в строке с товаром (не только с обязательных столбцов, но и с дополнительных, которые вы укажете), которые вы можете сохранить в переменные и в последствии вывести пользователю.

По умолчанию блок выводит переменную #{custom_answer}, из которой вы можете сохранить нужные вам значения по товару и вывести пользователю в следующем блоке, предварительно этот блок обозначив как #{none}.

Например для таблицы выше #{custom_answer} следующий: товар под номером 7: {'subcat': '0', 'Номер': 7, 'Категория': 'Тумбы', 'Подкатегория': '', 'Товар': 'Со шкафом\n', 'Цена': 700, 'Описание': '', 'Картинка': '', 'Что-то': '', 'status': '1'} У этого товара эти столбцы не заполнены, поэтому в доп.столбцах отображаются только название столбцов, а данные в них пустые ('Описание', 'Картинка', 'Что-то').

В отличии от 7-го товара, первый имеет эти данные:

{'subcat': '1', 'Номер': 1, 'Категория': 'Столы', 'Подкатегория': 'Дерево', 'Товар': 'Круглый обеденный\n', 'Цена': 1000, 'Описание': 'Описание ывапыпррпфп\n', 'Картинка': 'Урл картинки', 'Что-то': 'Нужная инфа', 'status': '1'}

Пример сохранения данных в блоке - поле "Сохранение значения из Json-ответа" по товару 1: status -> status; subcat -> subcat; Описание -> описание; Картинка -> image_url; Товар -> товар; Цена -> цена; и можно добавить еще блок в который попадет пользователь в случае успешного запроса и вывести, что-то такое:

Подробно о товаре #{image_url} #{описание} #{товар} - #{цена}

От него соответственно стрелка Назад и Купить.

Второй необязательный блок

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

Внимание!! - если вам не нужен один или оба эти блоки, то входящие стрелки с них, соответственно перенесите на следующие за ними блоки

Блок - В корзину

Ничего править не нужно. В запросе передаются следующие параметры: {"command":"cart","currency":"#{currency}","products_list":"#{products_list}","product_num":"#{product_num}","subcategory":"#{subcategory}","amount":"#{amount}","cart":"#{cart}"}

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

Запрос возвращает следующее: cart_str -> Корзина; - корзину для отображения cart_empty -> cart_empty; - переменную имеющую значение 1, если корзина не пуста и 0 - если пуста cart -> cart; - корзина с товарами для скрипта price_cart -> price_cart; - общая стоимость корзины status_cart -> status_cart; - успешное добавление 1, ошибка 0 subcat -> subcat; - с какой ветки пришел пользователь с подкатегориями (1) или без (0), соответственно при нажатии кнопки назад - по стрелке попадаем в пустой блок из которого две стрелки с условием по этой переменной.

В случае успешного запроса - в следующем блоке пользователю выводится содержание корзины: В корзине находится: #{Корзина} Общая стоимость: #{price_cart} #{currency}. С блока Корзина есть 4 возможных пути (кнопки): Список категорий - возвращает к выбору категории Оформить заказ - отправляет в блок с очисткой служебных переменных, перед отправкой в заявки, оставляет корзину и полную сумму Удалить - отправляет в блок со списком товаров и предложением ввести цифру Очистить - очищает все данные и отправляет к выбору категорий

Удалить из корзины

После перехода из корзины по кнопке Удалить, попадаем в блок со списком товаров и запросом номера позиции, которую нужно удалить. Введя номер, он запишется в перенную num_del и передасться в запросе на удаление:

Принимает следующие параметры, все они описаны выше в инструкции: {"command":"cart","currency":"#{currency}","num_del":"#{num_del}","cart":"#{cart}"} И возвращает: cart_str -> Корзина; - корзину для вывода пользователю cart_empty -> cart_empty; - переменная для проверки пустоты корзины на стрелке cart -> cart; - служебная корзина с товарами для скрипта price_cart -> price_cart; - общая стоимость товаров в корзине status_cart -> status_cart; - переменная для условия на стрелке 1 все отлично, 0 ошибка пользовательского ввода.