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:C10 → 6!A2:C10 |
[monthName] |
Название месяца на русском | [monthName]!A1 → Июнь!A1 |
[monthEN] |
Название месяца на английском | [monthEN]!A1 → June!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
Логика работы (консольная утилита)
- Загружает конфигурацию из указанного INI-файла.
- Если есть секция
external– загружает JSON поDataUrlи отправляет его в Медиадисплей (один раз). - Иначе загружает данные из Google Sheets (текст, таблицы, диаграммы, изображения, видео).
- Формирует JSON-запрос в формате
SetCoverRequest. - Опционально сохраняет JSON в
OutputFileName(если задан). - Отправляет POST-запрос на
ApiUrl/MediaController/1.0/SetCover. - Завершается с кодом возврата 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 запросов в минуту.