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

MD4 GoogleConnector: подключение Google Таблиц и внешних JSON к Медиадисплей - настройка INI-файла

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

Назначение

Утилита MD4_GoogleConnector.exe (и Windows-служба MD4_ContentService.exe) предназначена для автоматического обновления контента на экранах Медиадисплей. Она может:

  • Считывать данные из Google Таблиц (текст, таблицы, диаграммы, изображения, видео) по заданным диапазонам.
  • Загружать готовый JSON с внешнего HTTP-источника (REST API, статический файл).
  • Отправлять сформированный запрос на сервер Медиадисплей по протоколу SetCover.
  • Работать как в ручном режиме (однократный запуск), так и в режиме службы с периодическим обновлением (каждая секция имеет свой таймер).

Требования

  • Операционная система: Windows 7 / Server 2008 R2 и новее (x64), либо Linux через .NET Core/Runtime.
  • .NET Framework 4.7.2 (или .NET 8 для кроссплатформенной версии).
  • Сервер Медиадисплей – должен быть доступен по сети.
  • Файл credentials.json – для доступа к Google Sheets API (если используются таблицы).

Состав утилиты

Файл Назначение
MD4_GoogleConnector.exe Исполняемый файл (консольная утилита)
MD4_ContentService.exe Windows-служба (для фоновой работы, в папке MD4_ContentService)
Configs\*.ini Конфигурационные файлы (один на макет)
credentials.json Учётные данные Google API (сервисный аккаунт)
ServiceInstall.bat Установка/удаление службы (в папке MD4_ContentService)
install_eventlog.bat Создание журнала событий (в папке MD4_ContentService)

Структура INI-файла

1. Секция [Default] – основные настройки

[Default]
; ID Google-таблицы (обязателен, если не используется ExternalSource)
SpreadsheetId=1n29pDQYxg3_OTY3IP8tbUvo9ynnBH_ii8H8-c0T-A8U

; Имя приёмника на сервере Медиадисплей
ReceiverId=d1

; Путь к файлу credentials.json (абсолютный или относительный)
CredentialsPath=credentials.json

; URL сервера Медиадисплей
ApiUrl=http://127.0.0.1:5206

; НЕОБЯЗАТЕЛЬНЫЕ ПАРАМЕТРЫ:
; Имя выходного JSON-файла (для отладки)
; OutputFileName=debug.json

2. Секция [SwitchCover] – смена макета (темы)

Позволяет переключить экран на нужный макет перед отправкой данных.

[SwitchCover]
Cover=MenuBoard          ; Имя макета на сервере

3. Секции контента

Каждая секция описывает один элемент на экране. Поддерживаются типы:

Тип (type) Назначение Куда попадает в JSON
text Текстовая строка (заголовок, цена, дата) Отдельный контейнер Data
table Таблица с колонками и строками Контейнер widgetsTable
chart Диаграмма (график, столбцы, круг и др.) Контейнер Charts
image Изображение (логотип, фото) Контейнер Widgets
video Видеофайл Контейнер Widgets
external Загрузка готового JSON из внешнего источника – (игнорирует остальные секции)

Общие параметры для любой секции

Параметр Обязательный Значение
enable да 1, true, on – включить; 0, false, off – выключить.
type да Тип секции (см. таблицу выше).
name да Имя контейнера (виджета) в макете – должно совпадать с тем, что задано в редакторе Медиадисплей.
Timer нет (по умолч. 300) Интервал обновления в секундах (для службы). Для консольной утилиты игнорируется.

Параметры для каждого типа

Тип Дополнительные параметры
text source – адрес ячейки (например, Лист!A1) или value – статический текст.
table ListRange – диапазон (например, Лист!A2:D10), columns – имена колонок через запятую.
chart ListRange – диапазон с данными, charttype – тип диаграммы (bar, line, pie, area, radar, …).
image source – ячейка со ссылкой на картинку, или value – HTML-код <img src="...">.
video source – ячейка со ссылкой на видео, или value – прямая ссылка или HTML-код.
external DataUrl – URL для загрузки JSON, Timer – интервал обновления (для службы).

Подстановка текущего месяца – плейсхолдер [month]

В ListRange и source можно использовать специальные маркеры, которые заменяются на текущий месяц:

Маркер Подставляемое значение Пример (в июне)
[month] Номер месяца (1–12) [month]!A2:C106!A2:C10
[monthName] Название месяца на русском [monthName]!A1Июнь!A1
[monthEN] Название месяца на английском [monthEN]!A1June!A1

Требование: в Google Таблице должен существовать лист с соответствующим именем (например, 6 или Июнь).


Примеры конфигураций для разных макетов

А) Меню-борд (кафе) – макет MenuBoard

[Default]
SpreadsheetId=1n29pDQYxg3_OTY3IP8tbUvo9ynnBH_ii8H8-c0T-A8U
ReceiverId=d1
CredentialsPath=credentials.json
ApiUrl=http://127.0.0.1:5206

[SwitchCover]
Cover=MenuBoard

[Title]
enable=1
type=text
name=Заголовка_СУПЫ
source=Меню!A1
Timer=60

[Price]
enable=1
type=text
name=Ценик
source=Меню!E5
Timer=30

[TableMenu]
enable=1
type=table
name=Меню
ListRange=Меню!B2:E7
columns=Name,Description,Old_Price,Price
Timer=5

[Image]
enable=1
type=image
name=Фон_меню
source=Меню!F4
Timer=60

Б) Аэропорт (табло вылетов) – макет AirportFlight

[SwitchCover]
Cover=AirportFlight

[Title]
enable=1
type=text
name=Заголовок
source=Аэропорт2!B1
Timer=60

[TableFlight]
enable=1
type=table
name=Flight
ListRange=Аэропорт2!A3:H18
columns=Image,Airline,Flight,Airport,Registration,Racks,Departure,Status
Timer=10

В) Кинотеатр – макет Movie

[SwitchCover]
Cover=Movie

[Title]
enable=1
type=text
name=Заголовок
source=Кино!C1
Timer=60

[TableSchedule]
enable=1
type=table
name=ТаблицаСеансов
ListRange=Кино!A3:E6
columns=Кадр,Дата,Фильм,Время,Цена
Timer=10

Г) Диаграммы – макет Charts

[SwitchCover]
Cover=Charts

[ChartSales]
enable=1
type=chart
charttype=bar
name=ГрафикПродаж
ListRange=Диаграммы!A1:B13
Timer=30

Д) Внешний JSON (источник данных – сторонний сервер) – макет Statistic

[Default]
;Теперь не читает SpreadsheetId, если есть [ExternalSource]
SpreadsheetId=1
ReceiverId=d1
CredentialsPath=credentials.json
ApiUrl=http://127.0.0.1:5206

[SwitchCover]
Cover=Statistic

[ExternalSource]
enable=1
type=external
DataUrl=http://192.168.1.100:8000/display_data
Timer=30

Запуск утилиты

Синтаксис

MD4_GoogleConnector.exe config=<путь_к_INI>

Примеры

MD4_GoogleConnector.exe config=Configs\menu.ini

Логика работы (консольная утилита)

  1. Загружает конфигурацию из указанного INI-файла.
  2. Если есть секция external – загружает JSON по DataUrl и отправляет его в Медиадисплей (один раз).
  3. Иначе загружает данные из Google Sheets (текст, таблицы, диаграммы, изображения, видео).
  4. Формирует JSON-запрос в формате SetCoverRequest.
  5. Опционально сохраняет JSON в OutputFileName (если задан).
  6. Отправляет POST-запрос на ApiUrl/MediaController/1.0/SetCover.
  7. Завершается с кодом возврата 0 (успех) или кодом ошибки (1–5).

Логика работы (Windows-служба)

  • Запускается автоматически, читает конфиг, переданный через аргумент службы.
  • Для каждой секции запускает свой таймер с интервалом Timer.
  • При наличии секции external – работает только с внешним JSON и не инициализирует Google Sheets.
  • Логи пишутся в журнал MediaDisplayContentService (или в Application).

Формат выходного JSON (для справки)

{
  "Name": "d1",
  "Cover": "MenuBoard",
  "Data": [
    { "Name": "Ценик", "Text": "190₽", "widgetsTable": null },
    {
      "Name": "widgetsTable",
      "Text": null,
      "widgetsTable": [
        {
          "name": "Меню",
          "columns": ["Name","Description","Old_Price","Price"],
          "rows": [ ... ]
        }
      ]
    },
    {
      "Name": "Widgets",
      "Text": [
        { "name": "Логотип", "text": "<img src=\"...\">", "type": "image" },
        { "name": "Заголовка_СУПЫ", "text": "Супы", "type": "text" }
      ]
    }
  ]
}

Обработка ошибок и коды возврата

Код Название Описание Действие
0 Success Успешное выполнение
1 ConfigurationError Ошибка в INI-файле (отсутствуют обязательные секции, неверные типы) Проверьте синтаксис и наличие всех параметров
2 FileNotFound Не найден credentials.json или указанный конфиг Убедитесь, что файлы существуют и пути верны
3 GoogleApiError Проблема при обращении к Google Sheets API (неверный ID, квота, доступ) Проверьте SpreadsheetId, права сервисного аккаунта, лимиты
4 InvalidDataFormat Неверный формат данных (повреждённый JSON, нечисловые значения в диаграмме) Проверьте структуру таблиц и JSON-ответа от внешнего сервера
5 NetworkError Нет доступа к серверу Медиадисплей (неверный ApiUrl, отключена сеть) Проверьте сеть, адрес сервера, доступность порта

В службе ошибки логируются в EventLog (или файловый лог). При ошибке 3 (Google API) служба продолжает работу и повторит запрос через интервал таймера.


Полезные советы

  • Отладка через консоль: добавьте OutputFileName=debug.json в [Default], запустите утилиту и посмотрите полученный JSON – это точная копия того, что уходит на сервер.
  • Проверка имени контейнера: убедитесь, что name в INI совпадает с именем виджета в макете (регистр важен!).
  • Квоты Google API: не устанавливайте Timer слишком маленьким (менее 5 секунд) – можно превысить лимит 60 запросов в минуту.