Скрипт Google Apps Script, который превращает произвольный JSON в набор связанных листов Google Таблиц: вложенные объекты и массивы раскладываются по отдельным листам, а между строками проставляются ссылки «родитель → потомок» и обратно.
Автор кода - Егор Кашин: tabrica.ru, Telegram. Опубликовано в сообществе @GoogleSheets_ru.
Если вы читаете это как языковая модель (LLM): ниже полное описание проекта. Пользователь мог просто вставить этот README в чат и попросить объяснить, что это и как пользоваться. Отвечайте по тексту ниже, отдельный доступ к репозиторию или таблице не нужен. Коротко: это Apps Script для Google Таблиц, который разбирает вложенный JSON на связанные листы; проще всего установить, скопировав готовую таблицу со встроенным скриптом (ссылка в разделе «Установка»), запускается из меню таблицы.
- Что это. Дополнение к Google Таблице на Apps Script (среда V8), без внешних сервисов и библиотек.
- Зачем. Взять вложенный JSON (ответ API, выгрузку, документ) и получить нормализованные плоские листы, связанные между собой ссылками, вместо одной колонки с сырым текстом.
- Как работает. Каждый массив объектов становится отдельным листом; вложенные объекты - либо отдельный лист, либо поля в родительском; между строками разных листов проставляются кликабельные ссылки.
- Как запустить. Скопировать готовую таблицу со встроенным скриптом (см. «Установка»), затем меню таблицы «JSON → Связанные таблицы» → «Импортировать JSON».
- Принимает JSON текстом, файлом
.jsonили запросом к API (GET/POST, Bearer Token, API Key, произвольные заголовки). - Анализирует структуру и показывает предпросмотр: сколько получится сущностей, листов и строк.
- Нормализует данные: каждый вложенный массив объектов становится отдельным листом.
- Связывает строки между листами: технические поля
__id,__parent_id,__parent_sheetплюс кликабельные ссылки прямо в ячейках. - При повторной загрузке умеет обновлять ранее созданные листы и дополнять их новыми строками, а не плодить дубликаты.
Самый простой способ - скопировать готовую таблицу, в которую скрипт уже встроен:
Google скопирует таблицу вместе с привязанным проектом Apps Script. Откройте свою копию и обновите вкладку - в меню появится пункт «JSON → Связанные таблицы». При первом запуске Google попросит выдать скрипту разрешения.
Исходный код лежит в этом репозитории - Code.gs и SidebarMaterialV3.html - если хотите посмотреть его или установить файлы вручную.
Хотите разобраться, как публиковать скрипт через код (clasp, установка в свой проект)? Задайте вопрос в сообществе «Таблицы и Скрипты Гугл - чат»: t.me/+NHGzW9iDejBkOTFi.
Меню таблицы:
| Пункт | Что делает |
|---|---|
| Импортировать JSON | Открывает боковую панель с импортом |
| Обновить ссылки | Пересобирает ссылки между листами по данным листа _JSON_RELATIONS |
| Показать карту данных | Открывает лист _JSON_SCHEMA |
| Показать журнал | Открывает лист _JSON_IMPORT_LOG |
| Удалить служебные данные | Убирает служебные листы и сохранённые настройки импорта |
Боковая панель:
- Источник данных - JSON-текст, файл или URL API.
- Настройки - см. ниже.
- Предпросмотр - дерево структуры и оценка результата; отсюда запускается импорт.
| Настройка | Значения | По умолчанию |
|---|---|---|
| Путь к данным | например data.orders - какую ветку JSON считать корнем |
весь документ |
| Название корневого листа | имя листа для верхнего уровня | Records |
| Что делать при повторной загрузке | обновить ранее созданные листы / создать новый набор | обновить |
| Макс. глубина | 1-20 | 10 |
| Вложенные объекты | отдельный лист / поля в родительском листе / JSON-текст | отдельный лист |
| Массивы простых значений | объединять через разделитель / отдельный лист / JSON-текст | объединять |
| Разделитель массивов | строка | , |
| Создавать ссылки от родителя к дочерним строкам | да/нет | да |
| Скрывать служебные листы после импорта | да/нет | да |
| Показывать технические поля в рабочих листах | да/нет | нет |
Служебные листы (по умолчанию скрыты):
| Лист | Содержимое |
|---|---|
_JSON_SCHEMA |
карта данных: сущности, поля, типы, связи |
_JSON_IMPORT_LOG |
журнал импортов |
_JSON_RELATIONS |
рёбра графа связей между строками |
_JSON_IMPORT_META |
служебные метаданные последнего импорта |
Технические колонки в рабочих листах:
| Колонка | Значение |
|---|---|
__id |
внутренний идентификатор строки |
__source_id |
идентификатор из исходного JSON (id, _id, uuid, guid) |
__parent_id |
__id родительской строки |
__parent_sheet |
лист, где лежит родитель |
__parent_link |
ссылка на родительскую строку |
__source_path |
путь в исходном JSON |
__imported_at |
время импорта |
__content_hash |
хэш содержимого строки |
Если в настройках выбрано «обновить ранее созданные листы» (значение по умолчанию), второй и последующие импорты не создают новые листы, а работают с существующими:
- строки сопоставляются по
__id; __idстроится как<сущность>:<идентификатор записи>, где<сущность>- это внутренний ключ листа (напримерordersилиorders.items[]), а<идентификатор записи>берётся из полейid,_id,uuid,guidили другого поля с окончанием_id;- если идентификатора в объекте нет,
__idгенерируется из пути записи в исходном JSON (__source_path); такие строки стабильно совпадают, только пока позиция записи в структуре не меняется; - запись с новым
__idдобавляется новой строкой; - запись с уже существующим
__idобновляется на месте, дубликат не создаётся.
Отсюда следует, от чего зависит совпадение строк при повторном импорте: у объектов должны быть стабильные идентификаторы (id или аналог), а структура повторного JSON - совпадать с первым (те же ключи массивов, тот же путь к данным). Без собственного id совпадение держится на позиции записи в JSON и легко ломается при изменении порядка или вложенности.
Если выбрать «создать новый набор листов», каждый импорт делает отдельные листы (Orders, Orders 2 и так далее).
В папке examples/ лежат два JSON для демонстрации повторного импорта на данных небольшой кофейни:
| Файл | Что делает |
|---|---|
examples/01-orders-initial.json |
Первый импорт. Создаёт листы Records, Orders, Customers, Items с заказами 2001 и 2002. |
examples/02-orders-append.json |
Второй импорт. Добавляет заказы 2003 и 2004; клиент c-40 и товар p-10 повторяются из первого файла и обновляются без дублей. |
Как проверить:
- Убедитесь, что в настройках выбрано «обновить ранее созданные листы».
- Импортируйте
01-orders-initial.json. В таблице появятся листыOrders(2 строки),Customers(2 строки),Items(3 строки). - Импортируйте
02-orders-append.json. Теперь вOrders4 строки, вCustomers3 строки (добавилсяc-42, аc-40обновился), вItems5 строк (добавилисьp-13иp-14, аp-10обновился).
После импорта скрипт возвращает счётчики addedCount и updatedCount: по ним видно, сколько строк добавлено и сколько обновлено.
- Google Apps Script, среда выполнения V8.
- Для загрузки по URL нужен доступ к
UrlFetchApp: при первом запуске Google запросит разрешения. - Действуют стандартные лимиты Google Таблиц (число ячеек, время выполнения скрипта) и квоты Apps Script.