@meequ415

Не могу понять почему не работает код Apps Script?

Есть код простого телеграм бота 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();
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы