/** * Приём заявок с сайта «Центр Знаний» в Google Таблицу. * Вставьте этот код в редактор Apps Script, открытый из таблицы * (Расширения → Apps Script), и разверните как веб-приложение. */ // Название листа, куда пишутся заявки (создастся автоматически) const SHEET_NAME = 'Заявки'; // Почта для уведомлений о новых заявках. Оставьте '' — уведомлений не будет. const NOTIFY_EMAIL = ''; const HEADERS = ['Дата и время', 'Имя', 'Телефон', 'Уровень', 'Предметы / курсы', 'Комментарий', 'Статус']; function doPost(e) { const lock = LockService.getScriptLock(); lock.waitLock(10000); try { const data = JSON.parse((e && e.postData && e.postData.contents) || '{}'); // Простая защита от пустых и спам-заявок if (data.website) return json_({ ok: true }); // скрытое поле-ловушка заполнено ботом const name = clean_(data.name, 100); const phone = clean_(data.phone, 30); if (!name || !phone) return json_({ ok: false, error: 'Не заполнены имя или телефон' }); const sheet = getSheet_(); sheet.appendRow([ new Date(), name, "'" + phone, // апостроф — чтобы таблица не превратила номер в число clean_(data.level, 200), clean_(data.subjects, 500), clean_(data.comment, 1000), 'Новая' ]); if (NOTIFY_EMAIL) { MailApp.sendEmail(NOTIFY_EMAIL, 'Новая заявка с сайта: ' + name, 'Имя: ' + name + '\nТелефон: ' + phone + '\nУровень: ' + (data.level || '') + '\nПредметы: ' + (data.subjects || '') + '\nКомментарий: ' + (data.comment || '')); } return json_({ ok: true }); } catch (err) { return json_({ ok: false, error: String(err) }); } finally { lock.releaseLock(); } } // Проверка в браузере: откройте ссылку /exec — должно появиться {"ok":true,"status":"работает"} function doGet() { return json_({ ok: true, status: 'работает' }); } function getSheet_() { const ss = SpreadsheetApp.openById('15B3ssPgef4gBSXdeZW7G1KlEr8M9nDww4OEHYHZI9pc'); let sheet = ss.getSheetByName(SHEET_NAME); if (!sheet) sheet = ss.insertSheet(SHEET_NAME); if (sheet.getLastRow() === 0) { sheet.appendRow(HEADERS); sheet.getRange(1, 1, 1, HEADERS.length).setFontWeight('bold').setBackground('#d4af37'); sheet.setFrozenRows(1); sheet.getRange('A:A').setNumberFormat('dd.MM.yyyy HH:mm'); } return sheet; } function clean_(v, max) { v = String(v == null ? '' : v).trim(); if (/^[=+\-@]/.test(v)) v = "'" + v; // защита от формул в ячейках return v.slice(0, max); } function json_(obj) { return ContentService.createTextOutput(JSON.stringify(obj)) .setMimeType(ContentService.MimeType.JSON); } function testSubmission() { const result = doPost({ postData: { contents: JSON.stringify({ name: 'Тестовая заявка', phone: '79991234567', level: '5 класс', subjects: 'Математика', comment: 'Проверка записи из Apps Script', website: '' }) } }); console.log(result.getContent()); }