Добавьте действие "Python Script" и замените шаблон в редакторе кода на необходимый.
Пример PYTHON скрипта для получения доступных материалов
Ниже приведён пример кода.
Вы можете адаптировать его под свою таблицу.
Обратите внимание что в переменной json_data надо вставить данные из вашего JSON ключа, в переменной table_name надо прописать имя вашей таблицы, а в worksheet_name - название вкладки в таблице.
Обязательно проверьте
вы вставили реальный JSON сервисного аккаунта
email сервисного аккаунта имеет доступ к таблице
названия колонок в коде совпадают с таблицей
Шаг 3. Добавить в системный промпт инструкцию по использованию функций.
scope = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
debug("Область доступа определена")
# Данные сервисного аккаунта в формате JSON
json_data = {
"type": "service_account",
"project_id": "your_project_id",
"private_key_id": "your_private_key_id",
"private_key": "-----BEGIN PRIVATE KEY-----\nyour_private_key\n-----END PRIVATE KEY-----\n",
"client_email": "your_service_account_email",
"client_id": "your_client_id",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "your_client_cert_url"
}
debug("JSON данные сервисного аккаунта подготовлены")
def normalize_to_meters(value):
if isinstance(value, (int, float)):
return float(value)
value = str(value).lower().replace(",", ".").strip()
number_match = re.search(r"[\d.]+", value)
if not number_match:
raise ValueError("Некорректный формат размера")
number = float(number_match.group())
if "мм" in value:
return number / 1000
elif "см" in value:
return number / 100
elif "м" in value:
return number
else:
return number
# ================================
# ФУНКЦИЯ РАСЧЁТА СТОИМОСТИ
# ================================
# material_name — выбранный материал (например: МДФ)
# width — ширина изделия в метрах
# length — длина изделия в метрах
# Функция берёт цену материала из Google Таблицы
# и рассчитывает итоговую стоимость
def calculate_price(material_name, width, length):
# Подключаемся к Google Sheets через сервисный аккаунт
debug("Получаем ServiceAccountCredentials")
ServiceAccountCredentials = oauth2client['service_account']['ServiceAccountCredentials']
# Создаём учетные данные для авторизации
debug("Создаем учетные данные")
creds = ServiceAccountCredentials.from_json_keyfile_dict(json_data, scope)
# Авторизуемся в Google Sheets
debug("Авторизация в Google Sheets")
client = gspread.authorize(creds)
# Открываем таблицу с ценами
debug(f"Открываем таблицу {table_name}")
sheet = client.open(table_name).worksheet("Цены")
# Получаем все строки таблицы
debug("Получаем данные из таблицы")
rows = sheet.get_all_records()
debug("Ищем выбранный материал в таблице")
material_row = None
for row in rows:
if row["Материал"].lower() == material_name.lower():
material_row = row
break
# Если материал не найден — возвращаем ошибку
if not material_row:
return {"error": "Материал не найден. Проверьте название."}
# Берём цену за м² и минимальный заказ
price_per_m2 = float(material_row["Цена за м2"])
min_order = float(material_row["Мин. заказ м2"])
debug("Рассчитываем площадь")
area = float(width) * float(length)
# Если площадь меньше минимального заказа —
# считаем по минимальному объёму
if area < min_order:
area = min_order
debug("Рассчитываем итоговую стоимость")
total_price = area * price_per_m2
# Возвращаем результат расчёта
return {
"Материал": material_name,
"Площадь м2": round(area, 2),
"Итоговая стоимость": round(total_price, 2)
}
# ================================
# ПАРАМЕТРЫ ОТ ПОЛЬЗОВАТЕЛЯ
# ================================
# material — название материала
# width — ширина в метрах
# length — длина в метрах
table_name = 'Стройматериалы' # Название Google Таблицы
material_name = args.get("material", "")
width = normalize_to_meters(args.get("width", ''))
length = normalize_to_meters(args.get("length", ''))
# Выполняем расчёт
result_data = calculate_price(material_name, width, length)
debug("Возвращаем ответ")
result = {
"status": "success",
"data": result_data
}
scope = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
debug("Область доступа определена")
# Данные сервисного аккаунта в формате JSON
json_data = {
"type": "service_account",
"project_id": "your_project_id",
"private_key_id": "your_private_key_id",
"private_key": "-----BEGIN PRIVATE KEY-----\nyour_private_key\n-----END PRIVATE KEY-----\n",
"client_email": "your_service_account_email",
"client_id": "your_client_id",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "your_client_cert_url"
}
debug("JSON данные сервисного аккаунта подготовлены")
def get_available_materials():
"""
Возвращает список материалов,
у которых значение в колонке 'Наличие, м2' больше 1.5
"""
# Подключаемся к Google Sheets через сервисный аккаунт
debug("Получаем ServiceAccountCredentials")
ServiceAccountCredentials = oauth2client['service_account']['ServiceAccountCredentials']
# Создаём учетные данные для авторизации
debug("Создаем учетные данные")
creds = ServiceAccountCredentials.from_json_keyfile_dict(json_data, scope)
# Авторизуемся в Google Sheets
debug("Авторизация в Google Sheets")
client = gspread.authorize(creds)
# Открываем таблицу с ценами
debug(f"Открываем таблицу {table_name}")
sheet = client.open(table_name).worksheet(worksheet_name)
# Получаем все строки таблицы
debug("Получаем данные из таблицы")
rows = sheet.get_all_records()
materials = []
for row in rows:
material_name = str(row.get("Материал", "")).strip()
availability_raw = str(row.get("Наличие м2", "")).strip()
if not material_name or not availability_raw:
continue
# нормализация числа (поддержка 1,7)
availability_raw = availability_raw.replace(",", ".")
try:
availability = float(availability_raw)
except ValueError:
continue
if availability > 1.5:
materials.append({
"Материал": material_name,
"Наличие, м2": availability
})
return materials
table_name = "Стройматериалы"
worksheet_name = "Цены"
available_materials = get_available_materials()
result = {
"status": "success",
"available_materials": available_materials
}
Ты Василий, консультант в онлайн-магазине стройматериалов. Твоя задача — помочь клиенту подобрать нужный строительный материал (из предоставленных на текущий момент в наличии), уточнить его размеры, передать данные для расчёта стоимости и сообщить результат. Всегда следуй процессу в вежливой и профессиональной форме, избегая ненужных отвлечений.
# Steps
1. **Проверка наличия материалов:**
- Первым делом вызови функцию `get_available_materials` и получи список материалов, которые сейчас есть в наличии.
- Сообщи клиенту о поддерживаемых материалах, например: "На данный момент доступны следующие материалы: фанера, кирпич, цемент. Какой из них вам нужен?"
- Если клиент запрашивает материал, которого нет в наличии, извинись и предложи ему выбрать из доступных.
2. **Сбор информации:**
- Узнай у клиента, какой длины и ширины ему нужен выбранный материал.
- Если клиент не уточняет единицы измерения, уточни, например: "Пожалуйста, уточни, это в миллиметрах (мм), сантиметрах (см) или метрах (м)?"
3. **Уточнение единиц измерения:**
- Если клиент не указывает единицы измерения, уточни формат передаваемых данных.
- Если клиент указывает некорректную или нестандартную единицу, уточни и объясни, например: "Мы поддерживаем только миллиметры (мм), сантиметры (см) и метры (м). Пожалуйста, уточни, в каких единицах нужно рассчитать?"
4. **Передача данных для проверки стоимости:**
- Передай информацию о материале, длине и ширине в функцию `calculate_summ`, используя сокращённые обозначения единиц измерения: мм, см или м.
Например:
```calculate_summ(material_name="фанера", length="500 см", width="20 см")```
5. **Расчёт стоимости:**
- Ожидай, что функция вернёт итоговую стоимость на основе переданных данных, включая единицы измерения.
6. **Ответ клиенту:**
- Сообщи клиенту общую стоимость требуемого материала профессиональным и вежливым тоном.
- Избегай отвлечённых тем, сосредоточься только на ответе.
7. **Дополнительно (если необходимо):**
- Если клиент попросит уточнений или дополнительной информации, отвечай кратко и по делу.
# Output Format
- **Диалоговая форма ответа.**
- Включи:
- Результаты проверки наличия материалов.
- Вопросы для уточнения данных (материал, длина, ширина).
- Уточнение единиц измерения, если они не указаны.
- Передачу данных в функцию (`calculate_summ`) только с сокращёнными обозначениями единиц измерения (мм, см, м).
- Вежливый ответ с расчётом стоимости.
- Не выходи за рамки темы.
# Example
**Клиент:** Здравствуйте, мне нужно купить фанеру.
**Ты:** Здравствуйте! Спасибо, что обратились к нам. Сейчас я уточню, есть ли фанера в наличии. (*вызов функции get_available_materials*)
**Ты:** На данный момент в наличии фанера, кирпич и цемент. Вам нужна фанера, верно?
**Клиент:** Да, фанера.
**Ты:** Спасибо! Пожалуйста, уточни, какая длина и ширина тебе нужна?
**Клиент:** Длина 5, ширина 20.
**Ты:** Спасибо! Это в миллиметрах (мм), сантиметрах (см) или метрах (м)?
**Клиент:** Длина 5 метров, ширина 20 сантиметров.
**Ты:** Спасибо за уточнение! Передаю размеры для расчёта.
(*вызов функции calculate_summ(material_name="фанера", length="5 м", width="20 см")*)
**Ты:** Стоимость будет составлять 3200 рублей. Чем я могу ещё помочь?
# Notes
- Всегда начинай с вызова функции `get_available_materials` для проверки доступных материалов.
- При недостатке или неполноте данных уточняй их у клиента.
- Передавай в функцию только корректные сокращённые единицы измерения (мм, см, м).
Сработала функция: calculate_summ
Аргументы:
width: 2 м
length: 160 см
material: Фанера
Результат выполнения:
{
"status": "success",
"data": {
"Материал": "Фанера",
"Площадь м2": 3.2,
"Итоговая стоимость": 10240
}
}