Конструктор вопросов
Управляйте вопросами анкеты, их порядком и вариантами ответов (Typeform / Marquiz)
Ответы респондентов
Все заполненные анкеты дистрибьюторов с возможностью фильтрации и выгрузки
| ID | Дата и время | Дистрибьютор | ФИО респондента | Статус | Действия |
|---|
Аналитика и статистика
Сводные показатели удовлетворенности и распределение ответов
Всего анкет получено
0
за всё время сбора
Получено сегодня
0
активность за текущие сутки
Среднее время заполнения
0 мин
скорость прохождения анкеты
Индекс удовлетворенности
100%
доля позитивных оценок В2В
Распределение ответов по вопросам:
Интеграция с Google Таблицами / Docs
Автоматическая запись каждого ответа дистрибьютора напрямую в Google Sheets
Подключение Google Webhook
Вставьте URL опубликованного веб-приложения Google Apps Script (заканчивается на /exec).
Новые ответы автоматически отправляются в Google Sheets после заполнения анкеты. Кнопка проверки только проверяет доступ и не добавляет тестовую строку в таблицу. Кнопка синхронизации используется для повторной отправки недоставленных ответов.
Инструкция по настройке за 2 минуты:
- Откройте Google Диск и создайте новую Google Таблицу (назовите её, например: «CONTE B2B — Опрос подзаказ»).
- В меню выберите: Расширения → Apps Script.
- Удалите стандартный шаблон кода и вставьте скрипт из поля ниже.
- Нажмите Развернуть (синяя кнопка вверху справа) → Новое развертывание.
- Выберите тип: Веб-приложение, в поле «Кто имеет доступ» укажите: Все (Anyone).
- Скопируйте полученный URL веб-приложения и вставьте в поле выше!
// Опционально: укажите ID Google Документа для дублирования в Google Docs
var GOOGLE_DOC_ID = "";
function doPost(e) {
var lock = LockService.getScriptLock();
lock.tryLock(30000);
try {
var rawData = e.postData.contents;
var data = JSON.parse(rawData);
if (data.isTest) {
return ContentService.createTextOutput(JSON.stringify({ status: "success", message: "Тест успешен!" }))
.setMimeType(ContentService.MimeType.JSON);
}
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Ответы В2В") || ss.getActiveSheet();
if (sheet.getName() !== "Ответы В2В") sheet.setName("Ответы В2В");
var headers = ["ID", "Дата отправки", "Дистрибьютор", "ФИО", "Дата анкеты", "Время (сек)", "1. В2В", "2. Частота", "3. Недопоставки", "4. Ожидание", "5. Что поможет", "6. Отказы", "7. Пожелания", "Все ответы (JSON)"];
if (sheet.getLastRow() === 0) {
sheet.appendRow(headers);
var headerRange = sheet.getRange(1, 1, 1, headers.length);
headerRange.setFontWeight("bold").setBackground("#ED1C24").setFontColor("#FFFFFF");
sheet.setFrozenRows(1);
}
var ans = data.answers || {};
function getAns(k) {
var item = ans[k];
if (!item) return "";
if (Array.isArray(item.value)) return item.value.join("; ") + (item.other ? " (" + item.other + ")" : "");
return (item.value || "") + (item.other ? " (" + item.other + ")" : "");
}
var submissionId = data.id || ("CONTE-" + Utilities.getUuid().substring(0, 8).toUpperCase());
var timestampStr = new Date().toLocaleString("ru-RU", { timeZone: "Europe/Minsk" });
sheet.appendRow([
submissionId,
timestampStr,
data.distributor || "",
data.respondentName || "",
data.surveyDate || "",
data.timeSpentSeconds || 0,
getAns("q1"),
getAns("q2"),
getAns("q3"),
getAns("q4"),
getAns("q5"),
getAns("q6"),
getAns("q7"),
JSON.stringify(ans)
]);
// Если указан GOOGLE_DOC_ID — также пишем в Google Doc
if (GOOGLE_DOC_ID && GOOGLE_DOC_ID.length > 10) {
try {
var doc = DocumentApp.openById(GOOGLE_DOC_ID);
var body = doc.getBody();
body.appendHorizontalRule();
var h = body.appendParagraph("АНКЕТА B2B CONTE #" + submissionId);
h.setHeading(DocumentApp.ParagraphHeading.HEADING2).editAsText().setForegroundColor("#ED1C24");
body.appendParagraph("Дистрибьютор: " + (data.distributor || "") + " | ФИО: " + (data.respondentName || ""));
body.appendListItem("1. Удовлетворенность: " + getAns("q1"));
body.appendListItem("2. Частота заказов: " + getAns("q2"));
body.appendListItem("3. Доля подзаказа: " + getAns("q3"));
body.appendListItem("4. Готовность ждать: " + getAns("q4"));
body.appendListItem("5. Что поможет: " + getAns("q5"));
body.appendListItem("6. Отказы: " + getAns("q6"));
} catch (err) {}
}
return ContentService.createTextOutput(JSON.stringify({ status: "success" }))
.setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}
Общие настройки анкеты
Настройка заголовков, списка дистрибьюторов и брендинга