Обработка doPost() без постоянного развертывания веб-приложения — Google Apps Script

Как только я познакомился с Google Apps Script я начал учиться писать ботов Telegram. Основной проблемой было то, что после каждого изменения кода необходимо делать новое развертывание веб-приложения, чтобы все изменения в коде вступили в силу.

Мне, как новичку, это приходилось делать каждые две строчки кода плюс дебагинг того, что не работало 😅

Чуть позже я узнал про библиотеки в Google Apps Script и решил воспользоваться этим функционалом.

Решение проблемы (кратко)

  1. Создаем основной проект.
  2. Развертываем его как библиотеку.
  3. Создаем дополнительный проект, который будет запускать основной.
  4. Подключаем библиотеку TGBot по идентификатору скрипта.
  5. Создаем фунцию doPost():
Код.gs
function doPost(e) {
  TGBot.doPost(e)
}
  1. Развертываем как веб-приложение.
  2. Устанавливаем вебхук телеграм на адрес URL нашего веб-приложения:
bot.gs
function setWebhook() { 
  return UrlFetchApp.fetch("https://api.telegram.org/bot" + tokenTelegram + '/setWebhook?url=' + webAppUrl);
}

Решение проблемы (подробно)

Создаем новую Google Таблицу по ссылке https://docs.google.com/spreadsheets/.

Переименовываем и открываем в верхнем меню РасширенияApps Script.

Здесь будет находиться основной функционал нашего бота:

bot.gs
const tokenTelegram = "123412321233"; // Токен телеграм бота
const webAppUrl = ""; // Здесь пока пусто

function setWebhook() { 
  let response = UrlFetchApp.fetch("https://api.telegram.org/bot" + tokenTelegram + '/setWebhook?url=' + webAppUrl);
  Logger.log('telegram response status is ' + response.getContentText());
}

function doPost(e) {
  const ctx = JSON.parse(e.postData.contents);
  const ss = SpreadsheetApp.openById(spreadsheetsId); // Открываем документ
  const sheetLog = ss.getSheetByName("log"); // Находим лист с именем "log"
  sheetLog.getRange(1, 1).setValue(JSON.stringify(ctx, null, 5)); // в ячейку А1 пишем ответ бота
}

Развёртываем приложения как библиотеку

Кликаем Начать развертываниеНовое развертывание.

Выбираем тип развертывания → Библиотека

После развертывания идем в Настройки проекта и копируем Идентификатор скрипта:

Создаем наш запускатор

Создаем новый проект по ссылке https://script.google.com/home.

  1. В меню Библиотеки выбираем + Добавить библиотеку
  2. Вставляем ранее скопированный идентификатор скрипта
  3. Кликаем по кнопке Найти
  4. Версию оставляем Последний снимок кода
  5. В поле Идентификатор пишем сокращенное название с помощью которого мы сможем обращаться к нашей библиотеке. Я выбрал TGBot.

После всех настроек кликаем по кнопке Добавить

В скрипте код.gs пишем функцию:

Код.gs
function doPost(e) {
  TGBot.doPost(e)
}

Настал черед для развертывания, но уже как веб-приложение.

Кликаем Начать развертываниеНовое развертывание.

Выбираем тип развертывания → Веб-приложение

Пишем Описание (не обязательно), выбираем У кого есть доступВсе (!это важно) и кликаем Начать развертывание.

Скопируем адрес URL приложения, кликнув по кнопке ОК

Настраиваем наш основной проект

В const webAppUrl = ""; записываем адрес URL приложения с предыдущего шага и устанавливаем вебхук телеграм. Для этого необходимо выполнить функцию setWebhook().

bot.gs
const tokenTelegram = "123412321233"; // Токен телеграм бота
const webAppUrl = "https://script.google.com/macros/s/AKfycby530Q/exec"; // Вставляем адрес URL приложения

function setWebhook() { 
  let response = UrlFetchApp.fetch("https://api.telegram.org/bot" + tokenTelegram + '/setWebhook?url=' + webAppUrl);
  Logger.log('telegram response status is ' + response.getContentText());
}

function doPost(e) {
  const ctx = JSON.parse(e.postData.contents);
  const ss = SpreadsheetApp.openById(spreadsheetsId); // Открываем документ
  const sheetLog = ss.getSheetByName("log"); // Находим лист с именем "log"
  sheetLog.getRange(1, 1).setValue(JSON.stringify(ctx, null, 5)); // в ячейку А1 пишем ответ бота
}

Итог

Все, наш проект настроен. Теперь при изменении кода в основном проекте он автоматически будет обновляться после сохранения.

Если для вашей программы нужны будут дополнительные разрешения, необходимо обновить развертывание как библиотеки (нашего основного проекта), так и веб-приложения.