/
forward_hub
/
webhook_apps_script_google_sheets
Обзор
Документация
Войти
/
forward_hub
/
webhook_apps_script_google_sheets
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
apps script example
70 строк
4 KB
ayu
Create: apps script example
06 авг 2026, 20:12
Верифицирован
06 авг 2026, 20:12
8973156
Код
Авторство
О чём код?
/** * Обрабатывает POST-запросы от вебхуков и записывает данные в Google Таблицу. * Эта версия включает улучшения для надежности и отладки. * * @param {Object} e - Объект события от Google Apps Script, содержащий данные POST-запроса. * @returns {ContentService.TextOutput} - JSON-ответ со статусом операции. */ function doPost(e) { // 1. БЛОКИРОВКА ДЛЯ ПРЕДОТВРАЩЕНИЯ "ГОНКИ СОСТОЯНИЙ" // Используем LockService, чтобы запросы, пришедшие одновременно, обрабатывались // по очереди. Это защищает от повреждения данных при высокой нагрузке. const lock = LockService.getScriptLock(); // Пытаемся получить блокировку в течение 30 секунд. if (!lock.tryLock(30000)) { // Если не удалось получить блокировку, логируем и возвращаем ошибку. const errorMessage = "Не удалось получить блокировку для записи. Сервер перегружен."; Logger.log(errorMessage); return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": errorMessage })) .setMimeType(ContentService.MimeType.JSON); } try { // 2. НАДЕЖНОЕ ПОЛУЧЕНИЕ ЛИСТА // Лучше получать лист по имени, а не как "активный". Это гарантирует, что данные // всегда будут записываться в правильное место, даже если вы откроете другой лист в таблице. // !!! Замените "Лист1" на реальное имя вашего листа. const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"); if (!sheet) { throw new Error("Лист с именем 'Лист1' не найден!"); } // Парсим входящие JSON-данные const data = JSON.parse(e.postData.contents); // 3. УЛУЧШЕННАЯ РАБОТА С ДАТОЙ // Используем timestamp из данных от приложения, если он есть. Это более точное // время события, чем new Date() в момент выполнения скрипта. const eventDate = data.timestamp ? new Date(data.timestamp) : new Date(); // Готовим данные для строки. const rowData = [ eventDate, data.source || "N/A", data.sender || "N/A", data.message || "N/A" ]; // Добавляем строку в конец таблицы sheet.appendRow(rowData); // Возвращаем успешный ответ return ContentService.createTextOutput(JSON.stringify({ "status": "success" })) .setMimeType(ContentService.MimeType.JSON); } catch (error) { // 4. УЛУЧШЕННОЕ ЛОГИРОВАНИЕ ОШИБОК // Логируем ошибку на стороне сервера. Это критически важно для отладки. // Логи можно посмотреть в редакторе Apps Script: "Выполнения". Logger.log(`Ошибка: ${error.toString()}. Стек: ${error.stack}. Входящие данные: ${e.postData.contents}`); // Возвращаем клиенту (вашему приложению) сообщение об ошибке return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": error.toString() })) .setMimeType(ContentService.MimeType.JSON); } finally { // 5. ОБЯЗАТЕЛЬНОЕ ОСВОБОЖДЕНИЕ БЛОКИРОВКИ // В блоке finally мы гарантируем, что блокировка будет снята, даже если // в блоке try произошла ошибка. lock.releaseLock(); } }