Есть код простого телеграм бота Apps Script, бот должен опрашивать пользователя и вносить данные в таблицу. Упрощенная версия бота работала, усложненная версия перестала работать, не могу разобраться в чем проблема?
// Замените на ваш токен бота
const API_TOKEN = 'YOUR_BOT_TOKEN';
// Замените на ID вашей OpenAI Таблицы
const SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID';
// Имена листов в Google Таблице
const SHEET_EXPENSES = 'Расходы';
const SHEET_INCOMES = 'Приходы';
// Данные текущего пользователя
let currentUserData = {};
/**
* Устанавливает webhook для бота.
*/
function setWebhook() {
const webhookUrl = ScriptApp.getService().getUrl();
const url = `https://api.telegram.org/bot${API_TOKEN}/setWebhook?url=${encodeURIComponent(webhookUrl)}`;
try {
const response = UrlFetchApp.fetch(url, { method: 'post' });
Logger.log('Webhook установлен:', response.getContentText());
} catch (error) {
Logger.log('Ошибка при установке webhook:', error);
}
}
/**
* Обрабатывает входящие сообщения и callback-запросы от Telegram.
*/
function doPost(e) {
try {
const update = JSON.parse(e.postData.contents);
if (update.message) {
handleMessage(update.message);
} else if (update.callback_query) {
handleCallbackQuery(update.callback_query);
}
} catch (error) {
Logger.log('Ошибка в doPost:', error);
}
}
/**
* Обрабатывает сообщения от пользователя.
*/
function handleMessage(message) {
const chatId = message.chat.id;
const text = message.text;
if (text === '/start') {
startConversation(chatId);
} else if (currentUserData[chatId] && currentUserData[chatId].step) {
handleStep(message, chatId);
}
}
/**
* Начинает диалог с пользователем.
*/
function startConversation(chatId) {
currentUserData[chatId] = {};
send(chatId, 'Выберите операцию:', {
reply_markup: createReplyMarkup([['Расход'], ['Приход']])
});
}
/**
* Обрабатывает шаги диалога.
*/
function handleStep(message, chatId) {
const step = currentUserData[chatId].step || 1; // default step 1 if not set
const type = currentUserData[chatId].type;
try {
switch (step) {
case 1: // Тип операции
currentUserData[chatId].type = message.data;
currentUserData[chatId].step = 2;
send(chatId, 'Введите дату (ДД.ММ.ГГГГ):');
break;
case 2: // Дата
if (isValidDate(message.text)) {
currentUserData[chatId].date = message.text;
currentUserData[chatId].step = 3;
send(chatId, 'Введите сумму:');
} else {
send(chatId, 'Неверный формат даты. Используйте ДД.ММ.ГГГГ');
}
break;
case 3: // Сумма
if (!isNaN(parseFloat(message.text))) {
currentUserData[chatId].sum = parseFloat(message.text);
currentUserData[chatId].step = 4;
if (type === 'Расход') {
send(chatId, 'Выберите статью расходов:', {
reply_markup: createReplyMarkup(getExpenseCategories())
});
} else {
send(chatId, 'Наличие налога:', {
reply_markup: createReplyMarkup(getTaxOptions())
});
}
} else {
send(chatId, 'Неверный формат суммы. Введите число.');
}
break;
case 4: // Статья расходов/Налог
if (type === 'Расход') {
currentUserData[chatId].expenseCategory = message.data;
currentUserData[chatId].step = 5;
send(chatId, 'Введите комментарий:');
} else {
currentUserData[chatId].tax = message.data;
currentUserData[chatId].step = 6;
send(chatId, 'Введите проект:');
}
break;
case 5: // Комментарий (Расход)
currentUserData[chatId].comment = message.text;
saveData(chatId, type);
break;
case 6: // Проект (Приход)
currentUserData[chatId].project = message.text;
currentUserData[chatId].step = 7;
send(chatId, 'Введите комментарий:');
break;
case 7: // Комментарий (Приход)
currentUserData[chatId].comment = message.text;
saveData(chatId, type);
break;
}
} catch (error) {
Logger.log('Ошибка в handleStep:', error);
send(chatId, 'Произошла ошибка. Попробуйте ещё раз.');
currentUserData[chatId] = {}; // Сброс данных пользователя при ошибке
}
}
/**
* Обрабатывает callback-запросы от инлайн-кнопок.
*/
function handleCallbackQuery(callbackQuery) {
const chatId = callbackQuery.message.chat.id;
const data = callbackQuery.data;
const messageId = callbackQuery.message.message_id;
if (data === 'Расход' || data === 'Приход') {
currentUserData[chatId] = { step: 1, type: data };
send(chatId, `Вы выбрали ${data}.`, { reply_to_message_id: messageId });
} else {
handleStep({ data: data }, chatId);
send(chatId, '', { reply_to_message_id: messageId });
}
}
/**
* Сохраняет данные в OpenAI Таблицу.
*/
function saveData(chatId, type) {
const data = currentUserData[chatId];
const sheetName = type === 'Расход' ? SHEET_EXPENSES : SHEET_INCOMES;
const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
const sheet = ss.getSheetByName(sheetName);
try {
let rowData = [data.date, data.sum, data.comment];
if (type === 'Расход') {
rowData.splice(2, 0, data.expenseCategory);
} else {
rowData.splice(2, 0, data.tax, data.project);
}
sheet.appendRow(rowData);
send(chatId, 'Данные успешно сохранены!');
} catch (error) {
Logger.log('Ошибка при сохранении данных:', error);
send(chatId, 'Произошла ошибка при сохранении данных.');
} finally {
currentUserData[chatId] = {}; // Очищаем данные пользователя после сохранения
}
}
/**
* Проверяет корректность формата даты.
*/
function isValidDate(dateString) {
// Регулярное выражение для проверки формата ДД.ММ.ГГГГ
return /^\d{2}\.\d{2}\.\d{4}$/.test(dateString);
}
/**
* Создает инлайн-клавиатуру.
*/
function createReplyMarkup(buttons) {
return JSON.stringify({
inline_keyboard: buttons.map(row => row.map(text => ({ text, callback_data: text })))
});
}
/**
* Возвращает массив вариантов статей расходов.
*/
function getExpenseCategories() {
return [
['Налоги'],
['Расходы на офис'],
['НЗ'],
['Маркетинг'],
['Зарплатный фонд']
];
}
/**
* Возвращает массив вариантов наличия налога.
*/
function getTaxOptions() {
return [
['С налогом'],
['Без налога']
];
}
/**
* Отправляет сообщение пользователю в Telegram.
*/
function send(chatId, text, options = {}) {
const url = `https://api.telegram.org/bot${API_TOKEN}/sendMessage`;
const payload = {
chat_id: chatId,
text: text,
parse_mode: 'HTML',
reply_markup: options.reply_markup || {}
};
try {
const response = UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload)
});
Logger.log('Response:', response.getContentText());
} catch (error) {
Logger.log('Error sending message:', error);
}
}
// Вызываем функцию установки webhook при запуске скрипта
setWebhook();