- JavaScript 77.2%
- HTML 22.8%
| docs | ||
| screenshots | ||
| src | ||
| tests | ||
| .gitattributes | ||
| .gitignore | ||
| AGENTS.md | ||
| project.yaml | ||
| README.md | ||
Опросы в реальном времени
Инструмент для опросов аудитории внутри Банка России: ответы приходят на экран через секунду после отправки.
Участники открывают форму на телефоне и выбирают вариант ответа. На экране в зале сразу появляется распределение ответов и среднее значение — без выгрузок, без таблиц в ручную, без ожидания.
Как это устроено: Яндекс Формы → Google Таблица → экран с графиками (обновляется каждые 15 секунд)
Кому и зачем
| Задача | Как решается |
|---|---|
| Замерить ожидания аудитории в начале сессии и показать сдвиг в конце | Два опроса: «до» и «после». На экране — два значения и разница между ними |
| Не отрывать зал от обсуждения на подсчёт голосов | Ответы суммируются автоматически, ведущий комментирует график |
| Не просить IT и не ждать отчёта на следующий день | Настройка занимает 30 минут, работает в бесплатном аккаунте Google |
| Показать результат на проекторе или в трансляции | Одна ссылка на экран, полноэкранный режим, обновлений не надо нажимать |
| Роль | Что делает | Сколько времени |
|---|---|---|
| Организатор (сотрудник, который настраивает один раз) | Копирует таблицу, вставляет два файла, публикует ссылку, подключает форму | 30 минут один раз |
| Ведущий (сотрудник, который проводит опрос) | Открывает ссылку на экран, показывает QR-код аудитории, комментирует график | 1 минута, инструкцию читать не обязательно |
| Участник | Открывает ссылку или QR-код, выбирает вариант, нажимает «Отправить» | 10 секунд |
Что понадобится
| Что | Зачем | Обязательно |
|---|---|---|
| Аккаунт Google (личный или служебный) | В нём живут таблица и скрипт | Да |
| Яндекс Формы с вкладкой «Интеграция → API» | Сбор ответов | Да |
| 30 минут и браузер | Настройка по инструкции | Да |
| Экран, проектор или трансляция | Показ результатов залу | Да |
| Права администратора в Google Workspace | Если в домене запрещён Apps Script | Уточнить в ИТ-подразделении |
Быстрый старт: 5 шагов за 30 минут
Подробные версии этих шагов со всеми пояснениями — в вики проекта и в docs/SETUP.md.
Шаг 1. Скопируйте шаблон таблицы
Откройте шаблон и создайте копию в своём Google Диске:
В копии уже есть четыре листа: Ответы 1 и Ответы (туда приходят ответы), Кодирование (перевод ответов в числа) и Итоги (сводка с диаграммой).
Шаг 2. Вставьте два файла в таблицу
- В копии таблицы: Расширения → Apps Script
- Откройте файл
Code.gs, удалите всё, что там написано, и вставьте содержимое файлаsrc/Code.gs - Найдите строку
const REGION_HEADER = ...и напишите своё название, напримерКоммуникационная сессия · Ваш регион - Нажмите + слева → HTML → назовите файл
LiveWidget(имя ровно такое) и вставьте в него содержимоеsrc/LiveWidget.html - Сохраните: Ctrl + S
Строку SHEET_ID менять не нужно: если скрипт открыт из таблицы, таблица определяется автоматически.
Шаг 3. Опубликуйте ссылку
- Развёртывание → Новое развёртывание
- Тип (шестерёнка) → Веб-приложение
- Выполнять: Я сам · Доступ: Все
- Развернуть → при первом запросе Продолжить → Разрешить
- Скопируйте URL веб-приложения — это и есть ссылка на ваш экран
Важно. Рабочая ссылка начинается с
https://script.google.com/macros/s/.... Адрес редактора (.../editor?...) работать не будет.
Шаг 4. Подключите форму
- В Яндекс Формах откройте свою форму → вкладка Интеграция → API
- URL: вставьте ссылку из шага 3 · Метод: POST
- Заголовок:
Content-Type: application/json - Тело запроса — вставьте шаблон:
{
"secret": "ks-live-2026",
"survey": "1",
"response_id": "",
"inflation": "",
"submitted_at": ""
}
- Поставьте курсор между кавычками и подставьте значения кнопкой [+]:
response_id→ ID ответа,inflation→ ваш вопрос с вариантами,submitted_at→ Время отправки ответа - Сохранить
Главный подвох. Переменные, подставленные через
[+], должны стоять внутри кавычек. Если кавычки потерялись, Яндекс покажет ошибкуServiceJsonContentErrorв разделе Интеграция → API → История.
Шаг 5. Проверьте за 15 секунд
- Заполните форму один раз сами
- Откройте ссылку из шага 3
- Ответ появится на экране в течение 15 секунд
Если ответ не появился — см. wiki/Диагностика.
Как проходит опрос (для ведущего)
- Перед сессией — организатор очищает тестовые ответы: Apps Script → функция
clearAllTestResponses→ Run. - Откройте ссылку на экран на компьютере, подключённом к проектору, и нажмите F11 (полный экран).
- Покажите ссылку или QR-код формы на слайде. Участник открывает, выбирает вариант, нажимает «Отправить».
- Комментируйте график — он обновляется сам, каждые 15 секунд. Кнопку обновлять не нужно.
- После сессии все ответы остаются в таблице: листы Ответы 1 и Ответы, сводка на листе Итоги.
Полная шпаргалка: docs/RUNBOOK.md.
Что можно настроить без программиста
| Настройка | Где менять |
|---|---|
| Название над заголовком экрана | Code.gs, строка REGION_HEADER |
| Заголовок вкладки браузера | Code.gs, строка PAGE_TITLE |
| Секретный ключ приёма ответов | Code.gs, строка DEFAULT_SECRET |
| Варианты ответа и их числовые значения | лист Кодирование, столбцы A, B, C (ровно 7 строк) |
| Текст вопроса в форме | сама Яндекс Форма |
| Интервал обновления экрана | LiveWidget.html, число 15000 (миллисекунды) |
Что требует правки кода
| Задача | Что менять |
|---|---|
| Подписи вариантов на экране | LiveWidget.html, строка const labels=[...] — она не читается из таблицы |
| Заголовок экрана («Инфляционные ожидания участников») | LiveWidget.html, тег <h1> |
| Больше двух опросов на одном экране | Code.gs и LiveWidget.html |
| Вопрос не про инфляцию (другая шкала) | docs/CUSTOM_QUESTIONS.md |
Ограничения (честно)
- Ровно 7 вариантов ответа. Лист «Кодирование» занимает диапазон
A2:C8, скрипт читает только его. - Ровно два опроса на экране («до» и «после»). Третий опрос — это отдельная ссылка.
- Один вопрос на опрос. Поле ответа в запросе называется
inflation; смысл у него может быть любой, но имя фиксировано кодом. - Обновление раз в 15 секунд, не мгновенно. Ответ участника попадает в таблицу за 1–2 секунды, на экране виден через 15 секунд.
- Яндекс Формы не повторяют неудачную отправку. Если скрипт в этот момент был недоступен, ответ не придёт; это видно в Интеграция → API → История.
- Доступ «Все» означает: экран видит любой, у кого есть ссылка. Ссылку не стоит публиковать за контуром мероприятия.
- Бесплатный аккаунт Google выдерживает 20 000 обращений в сутки. Для сессии на 200 человек запас примерно сорокакратный.
Подробнее: docs/TECHNICAL.md, wiki/Ограничения-и-квоты.
Второй опрос на сессии
- Создайте вторую форму в Яндекс Формах.
- Подключите Интеграция → API так же, как на шаге 4, но в теле запроса поставьте
"survey": "2". - Ответы пойдут на лист Ответы, а первый опрос остаётся на Ответы 1.
- На экране автоматически появится сравнение: среднее по опросу 1, среднее по опросу 2 и разница в процентных пунктах.
Что где лежит
├── README.md — эта страница
├── src/
│ ├── Code.gs — серверная часть (Google Apps Script)
│ └── LiveWidget.html — экран с результатами
├── tests/
│ └── test_code_gs.mjs — автоматическая проверка скрипта (node tests/test_code_gs.mjs)
├── docs/
│ ├── SETUP.md — полная настройка, шаг за шагом
│ ├── RUNBOOK.md — шпаргалка ведущего в день сессии
│ ├── TROUBLESHOOTING.md — симптом → причина → что делать
│ ├── FAQ.md — частые вопросы
│ ├── TECHNICAL.md — формат запроса, логика, квоты, безопасность
│ ├── CUSTOM_QUESTIONS.md— как задать другой вопрос и другую шкалу
│ └── ROADMAP.md — план развития
├── screenshots/ — иллюстрации к инструкции
└── AGENTS.md — правила для агентов, которые дорабатывают проект
Вики проекта: https://git.nb.vivo300.ru/valalav/ks-live-survey/wiki
Вопросы и предложения: Issues






