MD4 GoogleConnector Обновления контента из Гугл Таблиц (Служба Windows)
> Медиадисплей > Интеграции > Интеграция с GoogleДата обновления: 12 июня 2026 г. Дата публикации: 3 июня 2026 г. Автор: Жапов Ананда
О службе
MD4_ContentService (MediaDisplayContentService) – это Windows-служба для автоматического обновления медиа-контента на экранах через сервер Медиадисплей. Служба работает в фоновом режиме, периодически загружает данные из Google Таблиц (или внешнего JSON-источника) и отправляет их на сервер по протоколу SetCover.
Поддерживаются все типы контента: текст, таблицы, изображения, видео и диаграммы. Каждый элемент может обновляться с собственным интервалом (таймером). Служба также умеет переключать макеты (Cover) и имеет собственный журнал событий для диагностики.
Основные характеристики
- Фоновая работа – служба запускается автоматически при старте Windows.
- Гибкое обновление – каждый элемент контента (текст, таблица, диаграмма, виджет) имеет свой таймер, задаваемый в конфигурации.
- Поддержка Google Sheets – чтение данных по
sourceилиListRangeс автоподстановкой текущего месяца ([month]). - Внешний JSON-источник – можно указать
DataUrlдля загрузки готового JSON (например, с удалённого сервера). - Смена макета – секция
[SwitchCover]переключает экран на нужный макет перед отправкой данных. - Собственный журнал событий – записи пишутся в
MediaDisplayContentService(илиApplicationпри недостатке прав). - Простая установка/удаление – с помощью бат-файла
ServiceInstall.bat(требуются права администратора).
Установка и настройка
Требования
- Операционная система: Windows 7 / Server 2008 R2 и новее (x64)
- .NET Framework 4.7.2 (или выше)
- Сервер Медиадисплей – должен быть доступен по сети
- Google Sheets API (если используются данные из таблиц) – необходимо получить
credentials.json - Права администратора для установки службы
Подготовка
- Скомпилируйте проект в Visual Studio (конфигурация Debug). Исполняемый файл
MD4_ContentService.exeпоявится вbin\Debug\. - Получите
credentials.jsonдля доступа к Google Sheets API (см. документацию утилиты MD4_GoogleConnector). - Поместите конфигурационные INI-файлы в папку
..\MD4_GoogleConnector\Configs\относительно рабочей папки службы (см. структуру проекта ниже). - Настройте конфигурационный INI-файл (например,
menu.ini). Примеры смотрите в разделе Конфигурационные файлы.
Установка службы
- Для начала запустите
install_eventlog.batот имени администратора, чтобы установить журналы службы MediaDisplayContentService (правой кнопкой мыши → «Запуск от имени администратора») - Запустите
ServiceInstall.batот имени администратора. - Выберите номер конфигурации из списка (1–24).
- В меню действий выберите 1 – Установить службу.
- Служба будет установлена с именем
MediaDisplayContentService. - Отображаемое имя: «Служба обновления медиа-контента».
- Тип запуска: Вручную.
- Запустите службу:
- Откройте
services.msc. - Найдите «Служба обновления медиа-контента».
- Нажмите «Запустить».
Удаление службы
- Остановите службу через
services.msc. - Запустите
ServiceInstall.batот администратора. - Выберите 2 – Удалить службу.
Структура проекта
Проект службы MediaDisplayContentService обычно располагается в одной рабочей области с утилитой MD4_GoogleConnector. Ожидаемая структура папок:
Ваш_репозиторий/
├── MD4_GoogleConnector/ # Утилита для работы с Google Sheets
│ ├── Configs/ # INI-файлы конфигураций
│ │ ├── flight.ini
│ │ ├── menu.ini
│ │ └── ...
│ ├── credentials.json # Учётные данные Google API
│ └── ...
└── MD4_ContentService/ # Служба Windows
├── bin/
│ └── Debug/
│ └── MD4_ContentService.exe
├── Log/ # Логи установки/удаления
│ └── ServiceInstall.log
├── ServiceInstall.bat # Установщик/удалитель
├── install_eventlog.bat # Создание журнала событий
└── ...
Важно: Путь к папке
Configsиcredentials.jsonзадаётся в коде службы. При стандартной настройке служба ищет их в..\MD4_GoogleConnector\относительно своего местоположения.
Конфигурационные файлы
Служба использует те же INI-файлы, что и консольная утилита MD4_GoogleConnector. Формат полностью совместим.
Секция [Default]
Обязательная секция с основными параметрами:
[Default]
SpreadsheetId=1n29pDQYxg3_OTY3IP8tbUvo9ynnBH_ii8H8-c0T-A8U
ReceiverId=d1
CredentialsPath=credentials.json
ApiUrl=http://127.0.0.1:5206
SpreadsheetId– идентификатор Google-таблицы (если используется Sheets).ReceiverId– имя приёмника на сервере Медиадисплей (напримерd1).CredentialsPath– путь к файлуcredentials.json.ApiUrl– адрес сервера Медиадисплей.OutputFileName(необязательно) – если указан, служба будет сохранять отправленный JSON в файл (для отладки).DataUrl(необязательно) – если задан, служба загружает данные по этому URL и игнорирует все остальные секции (кроме[SwitchCover]).
Секция [SwitchCover]
Переключает макет экрана перед отправкой данных:
[SwitchCover]
Cover=MenuBoard
Cover– имя макета (темы) на сервере Медиадисплей.
Секции контента
Каждая секция описывает один элемент на экране. Доступные параметры:
| Параметр | Описание |
|---|---|
enable |
Включить секцию: 1, true, on – да; 0, false, off – нет. |
type |
Тип: text, widgettext, table, chart, image, video. |
name |
Имя контейнера в макете (должно совпадать с именем виджета на экране). |
Timer |
Интервал обновления в секундах. |
source |
Адрес ячейки в Google Sheets (например, Лист!A1). |
value |
Статическое значение (альтернатива source). |
ListRange |
Диапазон для таблиц или диаграмм (например, Лист!A1:C10). |
columns |
Заголовки столбцов таблицы (через запятую). |
charttype |
Тип диаграммы (для type=chart). |
Подстановка текущего месяца
В ListRange и source можно использовать плейсхолдер [month], который автоматически заменяется номером текущего месяца (1–12). Например:
ListRange=[month]!W3:Z29 → 6!W3:Z29 в июне
Также доступны [monthName] (русское название) и [monthEN] (английское).
Примеры секций
Текст (отдельный контейнер):
[Title]
Timer=180
enable=true
type=text
name=Title
source=Лист!A1
Таблица (помещается в контейнер widgetsTable):
[Table1]
Timer=10
enable=1
type=table
name=Table
ListRange=Лист!A2:C10
columns=col1,col2,col3
Диаграмма (помещается в контейнер Charts):
[Chart1]
Timer=60
enable=1
type=chart
charttype=line
name=chart1
ListRange=Лист!D1:F10
Изображение (помещается в контейнер Widgets):
[Logo]
Timer=300
enable=1
type=image
name=Logo
source=Лист!G1
Видео (аналогично изображению, тип type=video).
Таймеры для отдельных секций
Каждая секция контента имеет свой Timer. Служба создаёт отдельный таймер для каждой секции, поэтому даже при большом количестве элементов обновление происходит независимо.