Содержание
Коротко
Как автоматически пройти гигабайты PDF и DOCX на Google Drive, вытащить названия и аннотации научных статей и не сгореть на лимитах Gemini API? На Habr описали связку Google Apps Script, встроенного OCR Drive, триггеров по времени, LockService и ротации API-ключей — без платных парсеров документов.
Что произошло
Задача автора — систематизировать большой архив научных работ: для каждого файла нужны точное название, краткое описание и проверка, фигурирует ли в соавторах конкретный учёный. Ручная работа нереальна; первый наивный скрипт на Apps Script упёрся сразу в три стены.
Лимит 6 минут на один запуск: OCR тяжёлого PDF плюс запрос к LLM занимает 15–40 секунд — на 20-м файле процесс обрывается. Бинарные форматы: из коробки GAS не читает PDF/DOCX — платные API дороги. Квоты Gemini на бесплатном тарифе: десятки запросов в минуту и сутки, быстрый HTTP 429.
Решение сложилось из нескольких приёмов. Скрытый OCR Google Drive: через Drive API копируете PDF/DOCX во временный Google Docs с флагом ocr: true — тот же движок, что при ручном открытии скана. Текст забираете через DocumentApp, временный файл удаляете в finally, иначе Drive забивается мусором.
Обход 6 минут — Google Таблица как простая БД: перед обходом кэшируете уже обработанные имена файлов, триггер времени каждую минуту перезапускает скрипт, новый процесс пропускает готовые строки и продолжает с 16-го файла. LockService закрывает гонку: пока один поток OCR-ит PDF больше минуты, второй триггер не должен взять тот же файл и создать дубль в таблице.
Ротация ключей Gemini: массив ключей из AI Studio, при 429 переключение на следующий; если обошли круг — пауза 30 секунд на сброс минутной квоты. Ответ LLM запрашивают как JSON (responseMimeType: application/json) — одним вызовом и title, и summary без markdown-обёртки.
Почему это важно
Паттерн показывает, что Apps Script — не только «макросы для таблиц», а платформа для долгих фоновых пайплайнов, если правильно разбить работу на итерации и защитить состояние. Для разработчиков, которые хранят знания в Drive, это дешевле, чем поднимать отдельный сервер с OCR и очередью — особенно когда объём — сотни–тысячи файлов, а не миллионы.
Слабое место — зависимость от квот Google и дисциплины очистки временных файлов. Зато связка бесплатный OCR + дешёвая модель Flash Lite + пул ключей даёт порядка 1500 документов в день на трёх ключах при ~2 часах непрерывной работы триггеров.
На практике
- Подключите Drive API в редакторе Apps Script (Сервисы), не только DocumentApp.
- OCR через
Drive.Files.copyсocr: trueиocrLanguage: "ru"— оборачивайте в try/finally с удалением temp-файла. - Ведите реестр в Google Sheets; перед обработкой стройте set/hash уже готовых имён.
- Time-driven trigger + явное удаление триггеров после завершения всего каталога.
LockService.getScriptLock()вокруг обработки одного файла — защита от параллельных запусков.- Пул
GEMINI_API_KEYS, переключение при 429,Utilities.sleep(30000)при исчерпании RPM всех ключей. responseMimeType: "application/json"вgenerationConfig— структурированный ответ без парсинга ```json.- Нетекстовые форматы (.pptx, .xlsx) заносите заглушкой без траты токенов.
Итог
Статья на Habr — практичный рецепт автономного реестра документов на Google Drive: OCR без сторонних сервисов, LLM для извлечения полей, устойчивость к таймаутам и квотам. Если ваш архив живёт в облаке Google, имеет смысл адаптировать пайплайн под свои колонки и промпты — детали и фрагменты кода в оригинале.