Мастер-таблица каждого канала: одна строка = один проект. Полный стандарт: раскладка колонок A–P «что и где», статусы, спринты и палитра, валидации, смарт-чипы, автозаполнение Duration/Last modified и как завести таблицу нового канала.
У каждого канала свой Google Sheet «<Канал> ContentList». Реестр — web/_data/channels.json (резолв по spreadsheet-id, не по имени: таб можно переименовывать). Один Trello-борд = один Shared Drive = один ContentList = одна страница-хаб.
files.copy. Держим его эталонно чистым: без данных, без лишних валидаций — копия наследует и грязь.Запись в листы — Sheets API под rscore-токеном (~/.config/rscore/token.json, [email protected]; scope drive покрывает Sheets v4). Чтение — Drive MCP (read-only).
Ровно 16 колонок, правее P — пусто (сетка обрезана). ⚠️ Кодом адресуем колонки по тексту заголовка в строке 1, не по букве.
🟡 рукой — заполняет человек · 🟦 кодом — пишет автоматика (rscore-токен) · 🟪 шаблон — часть вёрстки листа, данные не пишутся.
| Колонка | Что лежит | Кто пишет |
|---|---|---|
| A№ | Вертикальная метка Sprint 1…11, merge на весь блок спринта. Заголовок A1 = «№» — горизонтально. Данных в колонке нет. | шаблон |
| BVideo Project | Код и имя проекта: YTXX01_Имя_Гостя — как папка на Drive и карточка в Trello. | рукой |
| CNote | Свободные заметки по проекту: кто монтирует, договорённости, особые условия. Обычный текст, без валидаций. | рукой |
| DDoc | Google Doc проекта (сценарий / описание) — чип с прямой ссылкой docs.google.com/document/d/…/edit (не file-URL — иначе открывается вьюер Диска, §6). | рукой |
| EYouTube | Ссылка на ролик. Кодом пишется plain https://youtu.be/<id>; смарт-чипом её делает человек в UI (Tab → «заменить чипом») — API для YouTube-чипов не существует. | кодом |
| FThumbnail | Drive-чип обложки из 05_Thumbnail/. | кодом |
| GVideo link | Drive-чип мастера (файл, залитый на YouTube) из 06_YouTube/. | кодом |
| HLight link | Drive-чип 4K-копии с YouTube (yt-dlp, легче мастера) из 06_YouTube/. | кодом |
| IFile name | Имя мастер-файла (как в 06_YouTube). | кодом |
| JLast modified | Дата файла, формат yyyy-mm-dd. Кодом — только пустые ячейки (из Drive modifiedTime); заполненные руками даты не перезаписывать (§7). | кодом |
| KSource Material | Drive-чип папки проекта YTXX… на Shared Drive канала. | кодом |
| LStatus | Этап проекта — строгий дропдаун 11 токенов 01Created…11Archived, ячейка красится CF-правилом (§3). | рукой |
| MVideo ETA | Плановая дата выхода, yyyy-mm-dd (DATE-валидация). | рукой |
| NShorts | Чекбокс «шортсы есть»: ✓ = в папке O лежат готовые шортсы. Видно без клика по папке. | рукой |
| OShorts folder | Drive-чип папки шортсов проекта (04_Shorts) — туда заливают готовые шортсы, оттуда же публикуют на YouTube. Файлы внутри: <код проекта>_1.mp4, _2… — префикс показывает, из какого видео шортс. | кодом |
| PDuration | Длительность мастера, формат [m]:ss (37:31). Из Drive-метаданных видео (§7). | кодом |
Удалены в v2 (2026-07-03): Stage # (дублировал первые 2 символа Status), Hold (не использовался), Pcs (не нужна). Если видишь их в каком-то листе — лист отстал от канона, прогнать реформатор (§9).
Колонка L: строгий дропдаун + ровно 11 CF-правил (TEXT_EQ), по одному на статус. Никаких других CF-правил на листе нет. Что статусы значат по процессу — Project Ops §2.
Проекты сгруппированы в спринты. Колонка A — вертикальная метка Sprint N (merge на блок), весь блок A–O залит цветом спринта. Заливка статическая по ячейкам — не conditional и не banding. Пустые слоты спринта держим заранее.
#FCE5CD, bold, по центру, заморожена. A1 = «№» — горизонтально (не поворачивать!).DV-канон — ровно три правила, только в зоне спринтов (строка 2 … конец последнего блока). Валидация где попало = красные «Invalid»-треугольники по всему листу.
| Диапазон | Правило | Детали |
|---|---|---|
| L (Status) | ONE_OF_LIST | 11 токенов, strict, с дропдауном (showCustomUi). |
| M (Video ETA) | DATE_IS_VALID | Дата, не строгая (подсветит, не отобьёт). |
| N (Shorts) | BOOLEAN | Чекбокс «шортсы есть», strict. Значения — только boolean, не текст «FALSE». |
| всё остальное | — | Никаких валидаций: ни на шапке, ни на A–K, ни на O/P, ни правее/ниже зоны. |
Rich-чип (карточка-превью в ячейке) API умеет ставить только для Drive-файлов. Матрица по колонкам:
| Колонка | Чип | Как |
|---|---|---|
| D Doc · F Thumbnail · G Video · H Light · K Source · O Shorts folder | кодом ✓ | Sheets API: ячейка = "@" (плейсхолдер) + chipRuns[].chip.richLinkProperties.uri, fields "chipRuns,userEnteredValue". Сервер сам резолвит имя и mime. Готовый CLI: scripts/999_extra/sheets_chip_links.py.⚠️ Google-нативные файлы (Doc/Sheet/Slides) — uri строго ПРЯМОЙ editor-URL docs.google.com/document/d/<id>/edit, не drive.google.com/file/d/…: файловый URL открывает вьюер Диска, и документ приходится открывать вторым кликом. CLI сам определяет mimeType и строит верный URL; бинарные (mp4/jpg) — file/d/<id>/view. |
| E YouTube | руками | Программного пути не существует (ни API, ни Apps Script). Кодом кладём plain https://youtu.be/<id>, человек в UI: курсор на URL → Tab → «заменить смарт-чипом» (есть батч-конверт по диапазону). |
| Trello | никак | Google резолвит чипы только для своих сервисов; Trello-URL API отбивает (400). Если нужна ссылка — обычный =HYPERLINK(). |
python3 ~/YTAI/scripts/999_extra/sheets_chip_links.py \
--sheet <SPREADSHEET_ID> --tab "<таб>" \
--chip "G12=<fileId|url>" --chip "H12=…" --chip "F12=…" \
--dry-run # сначала посмотреть, потом без флага; --verify для контроля
Грабли: плейсхолдер именно @; перезапись userEnteredValue стирает старые chipRuns — слать вместе; на чтении чип виден как chipRuns (форма ≠ записи).
Обе колонки заполняются кодом из метаданных мастер-файла на Drive. File id берём из чипа G Video link.
files.get(fileId, fields="videoMediaMetadata") → durationMillis. В ячейку — serial: millis/1000/86400, формат [m]:ss.videoMediaMetadata пустой. Fallback: длительность с YouTube:yt-dlp --force-ipv4 --skip-download \ --print duration "https://youtu.be/<id>"
files.get(fileId, fields="modifiedTime") → дата yyyy-mm-dd.modifiedTime = дата заливки на Drive, а не дата монтажа: у файлов, залитых пачкой, она одинаковая и врёт. Даты, поставленные рукой, — не перезаписывать.Таблица = четвёртый слой запуска канала (Trello → Drive → ContentList → хаб). Полный процесс запуска — Channel Launch §4.
files.copy) — наследует поворот меток, палитру, DV и CF 1:1. Не строить лист с нуля через API — поворот 90° программно не ставится. Если spreadsheet-id должен остаться прежним (легаси-таблица канала) — sheets.copyTo таба шаблона внутрь неё: тоже сохраняет поворот; данные перелить, старый таб скрыть (кейс YTCH).<Канал> ContentList → на Shared Drive канала, доступ anyone-with-link reader.web/_data/channels.json (поле sheet). Резолв всех автоматик — по id.yyyy-mm-dd.scripts/999_extra/contentlist_reform_v2.py — привести лист к канону v2 (структура, DV, CF, палитра)scripts/999_extra/sheets_chip_links.py — поставить Drive-чипыscripts/08_youtube/upload_youtube.py — заливка ролика (пишет строку после аплоада)~/.config/rscore/token.json — токен записи ([email protected], scope drive)