Опросы аудитории в реальном времени для подразделений Банка России: Яндекс Формы → Google Apps Script → экран с графиками. Настройка 30 минут, без программиста. https://git.nb.vivo300.ru/valalav/ks-live-survey/wiki
  • JavaScript 77.2%
  • HTML 22.8%
Find a file
2026-11-09 18:55:52 +03:00
docs fix(docs,tests): синхронизация контракта вебхука, исправление атрибуции аудита и регрессионный тест SHEET_ID [gemini-3.8-flash @ 2026-11-09T18:39+03:00] 2026-11-09 18:38:59 +03:00
screenshots feat: инициализация репозитория — скрипты, дашборд, инструкция со скриншотами 2026-11-09 18:12:35 +03:00
src fix(core): безопасный дефолт SHEET_ID, нормализация диапазонов и упрощение шаблона 2026-11-09 18:21:54 +03:00
tests fix(docs,tests): синхронизация контракта вебхука, исправление атрибуции аудита и регрессионный тест SHEET_ID [gemini-3.8-flash @ 2026-11-09T18:39+03:00] 2026-11-09 18:38:59 +03:00
.gitattributes docs: продукт-упаковка, полная документация и автотест скрипта 2026-11-09 18:17:50 +03:00
.gitignore chore: ignore _worktree directory 2026-11-09 18:55:52 +03:00
AGENTS.md fix(docs,tests): синхронизация контракта вебхука, исправление атрибуции аудита и регрессионный тест SHEET_ID [gemini-3.8-flash @ 2026-11-09T18:39+03:00] 2026-11-09 18:38:59 +03:00
project.yaml fix: project.yaml — кавычки вокруг description с двоеточиями, добавить related cb/ks-kbr-2026 2026-11-09 18:25:55 +03:00
README.md docs: продукт-упаковка, полная документация и автотест скрипта 2026-11-09 18:17:50 +03:00

Опросы в реальном времени

Инструмент для опросов аудитории внутри Банка России: ответы приходят на экран через секунду после отправки.

Участники открывают форму на телефоне и выбирают вариант ответа. На экране в зале сразу появляется распределение ответов и среднее значение — без выгрузок, без таблиц в ручную, без ожидания.

Дашборд во время сессии

Как это устроено: Яндекс Формы → Google Таблица → экран с графиками (обновляется каждые 15 секунд)


Кому и зачем

Задача Как решается
Замерить ожидания аудитории в начале сессии и показать сдвиг в конце Два опроса: «до» и «после». На экране — два значения и разница между ними
Не отрывать зал от обсуждения на подсчёт голосов Ответы суммируются автоматически, ведущий комментирует график
Не просить IT и не ждать отчёта на следующий день Настройка занимает 30 минут, работает в бесплатном аккаунте Google
Показать результат на проекторе или в трансляции Одна ссылка на экран, полноэкранный режим, обновлений не надо нажимать
Роль Что делает Сколько времени
Организатор (сотрудник, который настраивает один раз) Копирует таблицу, вставляет два файла, публикует ссылку, подключает форму 30 минут один раз
Ведущий (сотрудник, который проводит опрос) Открывает ссылку на экран, показывает QR-код аудитории, комментирует график 1 минута, инструкцию читать не обязательно
Участник Открывает ссылку или QR-код, выбирает вариант, нажимает «Отправить» 10 секунд

Что понадобится

Что Зачем Обязательно
Аккаунт Google (личный или служебный) В нём живут таблица и скрипт Да
Яндекс Формы с вкладкой «Интеграция → API» Сбор ответов Да
30 минут и браузер Настройка по инструкции Да
Экран, проектор или трансляция Показ результатов залу Да
Права администратора в Google Workspace Если в домене запрещён Apps Script Уточнить в ИТ-подразделении

Быстрый старт: 5 шагов за 30 минут

Подробные версии этих шагов со всеми пояснениями — в вики проекта и в docs/SETUP.md.

Шаг 1. Скопируйте шаблон таблицы

Откройте шаблон и создайте копию в своём Google Диске:

👉 Шаблон Google Таблицы

В копии уже есть четыре листа: Ответы 1 и Ответы (туда приходят ответы), Кодирование (перевод ответов в числа) и Итоги (сводка с диаграммой).

Листы таблицы-шаблона

Шаг 2. Вставьте два файла в таблицу

  1. В копии таблицы: Расширения → Apps Script
  2. Откройте файл Code.gs, удалите всё, что там написано, и вставьте содержимое файла src/Code.gs
  3. Найдите строку const REGION_HEADER = ... и напишите своё название, например Коммуникационная сессия · Ваш регион
  4. Нажмите + слева → HTML → назовите файл LiveWidget (имя ровно такое) и вставьте в него содержимое src/LiveWidget.html
  5. Сохраните: Ctrl + S

Строку SHEET_ID менять не нужно: если скрипт открыт из таблицы, таблица определяется автоматически.

Редактор Apps Script

Шаг 3. Опубликуйте ссылку

  1. Развёртывание → Новое развёртывание
  2. Тип (шестерёнка) → Веб-приложение
  3. Выполнять: Я сам · Доступ: Все
  4. Развернуть → при первом запросе Продолжить → Разрешить
  5. Скопируйте URL веб-приложения — это и есть ссылка на ваш экран

Настройки публикации

Подтверждение доступа Google

Важно. Рабочая ссылка начинается с https://script.google.com/macros/s/.... Адрес редактора (.../editor?...) работать не будет.

Шаг 4. Подключите форму

  1. В Яндекс Формах откройте свою форму → вкладка Интеграция → API
  2. URL: вставьте ссылку из шага 3 · Метод: POST
  3. Заголовок: Content-Type: application/json
  4. Тело запроса — вставьте шаблон:
{
  "secret": "ks-live-2026",
  "survey": "1",
  "response_id": "",
  "inflation": "",
  "submitted_at": ""
}
  1. Поставьте курсор между кавычками и подставьте значения кнопкой [+]: response_id → ID ответа, inflation → ваш вопрос с вариантами, submitted_at → Время отправки ответа
  2. Сохранить

Заголовки запроса

Тело запроса

Главный подвох. Переменные, подставленные через [+], должны стоять внутри кавычек. Если кавычки потерялись, Яндекс покажет ошибку ServiceJsonContentError в разделе Интеграция → API → История.

Шаг 5. Проверьте за 15 секунд

  1. Заполните форму один раз сами
  2. Откройте ссылку из шага 3
  3. Ответ появится на экране в течение 15 секунд

Если ответ не появился — см. wiki/Диагностика.


Как проходит опрос (для ведущего)

  1. Перед сессией — организатор очищает тестовые ответы: Apps Script → функция clearAllTestResponses → Run.
  2. Откройте ссылку на экран на компьютере, подключённом к проектору, и нажмите F11 (полный экран).
  3. Покажите ссылку или QR-код формы на слайде. Участник открывает, выбирает вариант, нажимает «Отправить».
  4. Комментируйте график — он обновляется сам, каждые 15 секунд. Кнопку обновлять не нужно.
  5. После сессии все ответы остаются в таблице: листы Ответы 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/Ограничения-и-квоты.


Второй опрос на сессии

  1. Создайте вторую форму в Яндекс Формах.
  2. Подключите Интеграция → API так же, как на шаге 4, но в теле запроса поставьте "survey": "2".
  3. Ответы пойдут на лист Ответы, а первый опрос остаётся на Ответы 1.
  4. На экране автоматически появится сравнение: среднее по опросу 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