ТЕХНИЧЕСКАЯ ДОКУМЕНТАЦИЯ

Как работает конфигурация: от таблицы до экрана

> Медиадисплей > Интеграции > Интеграция с Google
Дата обновления: 12 июня 2026 г. Дата публикации: 4 июня 2026 г. Автор: Жапов Ананда

Что важно знать? Важно показать взаимосвязь трёх элементов:

  1. Макет (экран) – то, что видит пользователь на экране (дизайн, виджеты, таблицы, картинки).
  2. Google Таблица – источник данных (текст, ссылки, числа).
  3. INI-конфиг – мост между таблицей и макетом.

Макет (экран) – что это и где брать имена контейнеров

Макет – это дизайн-проект экрана, созданный в редакторе Медиадисплей. В нём есть:
- Контейнеры – области, куда подставляются данные (текст, таблица, диаграмма, виджет).
- Имена контейнеров – уникальные идентификаторы, которые вы задаёте при редактировании макета.

Как узнать имя контейнера?

  1. Откройте браузер, зайдите на сервер Медиадисплей и зайдите вкладку “Макеты”.
  2. Слева вы можете видеть их название макета (например, MenuBoard).
  3. Нажмите на элемент (текстовое поле, таблицу, картинку) – в выбранном компоненте будет указана поле Name или Имя.
  4. Перепишите это имя – оно должно совпадать со значением name в вашем INI-файле.

Пример для макета MenuBoard (меню кафе):

Элемент на экране Имя контейнера (Name) Тип Что отображает
Заголовок «СУПЫ» Заголовка_СУПЫ widgettext Название раздела
Блок с ценой Ценик text Стоимость блюда
Таблица с блюдами Меню widgetsTable Список блюд (колонки Name, Description, Old_Price, Price)
Картинка блюда Фон_меню image (виджет) Фото блюда
Описание блюда Описание_фона widgettext Ингредиенты

Важно: Имена контейнеров чувствительны к регистру! В INI-файле пишите точно так же, как в редакторе макетов.


Google Таблица – структура и ID

Ваша Google Таблица содержит несколько листов. Каждый лист может использоваться для разных целей.

Как найти ID таблицы (SpreadsheetId)?

Откройте таблицу в браузере. В адресной строке будет URL вида:

image

image

Часть 1n29pDQYxg3_OTY3IP8tbUvo9ynnBH_ii8H8-c0T-A8U – это и есть SpreadsheetId. Скопируйте его в секцию [Default] вашего INI-файла.

Структура листа на примере меню (лист «Меню»)

Представьте, что лист «Меню» выглядит так:

image

Тогда в INI-файле вы напишете:

[Title]
Timer=60
enable=1
type=widgettext
name=Заголовка_СУПЫ
source=Меню!A1   # ячейка A1 содержит слово «Супы»

[MenuPrice]
Timer=60
enable=1
type=text
name=Ценик
source=Меню!E4   # ячейка E4 содержит 200₽

[TableMenuBoard]
Timer=10
enable=1
type=table
name=Меню
ListRange=Меню!B2:E7   # колонки B,C,D,E
columns=Name,Description,Old_Price,Price

[MenuImage]
Timer=60
enable=1
type=image
name=Фон_меню
source=Меню!F4   # ячейка F4 содержит URL картинки

[MenuDescription]
Timer=60
enable=1
type=widgettext
name=Описание_фона
source=Меню!C4   # ячейка C4 содержит описание

[MenuName]
Timer=60
enable=true
type=widgettext
name=Название_блюд
source=Меню!B4   # ячейка B4 содержит название блюд как лагман

Как понять, какой диапазон указать в ListRange?

  1. Определите, какие данные должны попасть в таблицу на экране.
  2. В Google Sheets выделите прямоугольную область (например, B2:E7).
  3. Убедитесь, что первая строка диапазона – это заголовки колонок (если они нужны), а последующие – данные.
  4. Запишите диапазон в формате ИмяЛиста!B2:E7.

Как работает source?

  • Если source=Меню!A1, утилита возьмёт значение из ячейки A1 листа «Меню».
  • Если value=Статический текст, то данные из таблицы не читаются, используется то, что написано в INI.
  • Если и source, и value пусты – секция игнорируется.

Сопоставление INI-конфига с макетом – пошаговая проверка

Когда вы запускаете утилиту (или службу), происходит следующее:

  1. Читается INI-файл.
  2. Для каждой секции:
  3. Если type=text, создаётся контейнер с именем name и значением (из value или из source).
  4. Если type=table, читается диапазон ListRange, строки превращаются в таблицу. Имя таблицы = name.
  5. Если type=chart, читается диапазон ListRange, строится диаграмма. Имя диаграммы = name.
  6. Если type=widgettext, image или video, создаётся виджет в контейнере Widgets.
  7. Формируется JSON-запрос SetCoverRequest.
  8. Запрос отправляется на http://127.0.0.1:5206/MediaController/1.0/SetCover.
  9. Сервер Медиадисплей обновляет экран.

Чтобы убедиться, что конфиг работает:

  • Временно включите OutputFileName=test.json в секции [Default].
  • Запустите утилиту вручную (MD4_GoogleConnector.exe config=...).
  • Откройте полученный JSON и проверьте, что:
  • Имена контейнеров совпадают с именами в макете.
  • Значения взяты из правильных ячеек.
  • Таблицы содержат ожидаемые строки.

Примеры, как это всё работает:

1. Макет в редакторе Медиадисплей

image

На этом скриншоте показан макет MenuBoard. Выделен элемент «Ценик», в правой панели свойств видно поле Name со значением Ценик.

2. Google Таблица с данными

На скриншоте виден лист «Меню». Подсвечены ячейки:
- A1 – значение «Супы» (заголовок)

image

- E4 – значение «200₽» (цена)
image

- Диапазон B2:E7 – таблица с блюдами
image

- F4 – ссылка на картинку
image

3. INI-файл с соответствиями

Вернитесь туда вверх и еще раз посмотрите конфигурацию и вы видите, где строки source=Меню!A1, source=Меню!E4, ListRange=Меню!B2:E7 указано к каким элементам макета они относятся.

4. Результат на экране

image

Скриншот из веб-интерфейса Медиадисплей, где отображаются данные: заголовок «Супы», цена 200₽, таблица, картинка.


Частые ошибки и их решение

Проблема Вероятная причина Как исправить
На экране пусто Неправильный ReceiverId Убедитесь, что ReceiverId=d1 (или тот, который вы создали на сервере).
Текст не обновляется Неверное имя контейнера Проверьте name – он должен в точности совпадать с именем элемента в макете.
Таблица пустая или не те данные Неверный диапазон ListRange Проверьте, что в таблице есть данные, и диапазон указан правильно (например, Лист!A2:D10, а не Лист!A2:D10 с лишним пробелом).
Изображение не отображается Неверная ссылка или тип Убедитесь, что type=image, а в source или value – полный URL или HTML-код.
Ошибка 403 Google API Не настроен доступ Дайте сервисному аккаунту права читателя к таблице.
Ошибка 429 Google API Превышена квота запросов Увеличьте интервалы Timer (например, с 10 секунд до 20) или оптимизируйте количество секций.
Секция игнорируется enable не равен 1/true/on Проверьте значение enable.
Нет данных из [month] Сегодня, например июня, а лист называется 6? Лист должен называться числом месяца (1,2,3…12) или названием месяца («Июнь», «June»).

Рекомендации

  1. Сначала запустите консольную утилиту (не службу). Это быстрее для отладки.
  2. Включите OutputFileName – так вы увидите, какой JSON уходит на сервер.
  3. Проверяйте JSON – если в нём нет нужного контейнера, значит, в INI-файле ошибка в name или type.
  4. Используйте value для статического текста – так вы проверите, правильно ли настроен макет, без Google Sheets.
  5. Для таблиц сначала выведите их в JSON с OutputFileName – убедитесь, что строки и колонки правильные.
  6. После отладки переносите конфиг в службу.

Если всё равно не работает – сохраните JSON, полученный от утилиты, и скриншот макета с именами контейнеров. Сравните их – расхождения станут очевидны.