Игорь Градов
Игорь Градов
6 мин
ai

Gemini в Google Таблицах: параллельные запросы экономят до 80 секунд на пачку

Google Таблица, скрипт на Google Apps Script и модель Gemini позволяют собрать автономный анализатор новостей без выделенного сервера, и ключевой приём здесь в том, как отправлять несколько запросов к Gemini параллельно, чтобы уложиться в жёсткий лимит времени.

Gemini в Google Таблицах: параллельные запросы экономят до 80 секунд на пачку
Почему это важно

Google Apps Script даёт на один запуск всего 6 минут, и при последовательных вызовах Gemini скрипт не успевает обработать всю очередь новостей. Параллельная отправка через fetchAll() экономит до 80 секунд и превращает таблицу в полноценный бессерверный конвейер.

Автор оригинального решения два месяца дорабатывал инструмент вместе с ChatGPT и Gemini. Задача конкретная: мониторить около 100 RSS-источников на тему применения ИИ в энергосбережении, отбирать релевантные материалы по смыслу (не по ключевым словам), переводить на русский и отправлять готовые заметки в Telegram с кнопками «Опубликовать» и «Отклонить». Ниже разобран один приём из этого конвейера: параллельные запросы к Gemini в Google Таблицах.

Что понадобится

  • Аккаунт Google с доступом к Google Таблицам и Google Apps Script (GAS)
  • API-ключ Gemini (бесплатного тарифа достаточно для старта)
  • Telegram-бот (токен от BotFather) для получения результатов
  • Базовое понимание, что такое промпт (текстовая инструкция для модели) и RSS (формат подписки на обновления сайтов)
  • Около часа на настройку, если работаете по готовому шаблону

Как устроена таблица и зачем нужны четыре листа?

В Google Таблице создаются четыре листа:

  • RSS содержит список источников (в оригинале около 100 лент)
  • NewsInbox принимает свежие анонсы до отбора
  • NewsQueue хранит отобранные статьи и готовые черновики постов
  • Log фиксирует уже обработанные ссылки, чтобы не дублировать работу

Модели Gemini разделены по задачам. Gemini 2.5 Flash-Lite (с лимитом 15 запросов в минуту и 500 в день) решает, подходит ли анонс по смыслу. Gemini 2.5 Flash (с лимитом 5 запросов в минуту и 20 в день) получает тексты уже отобранных статей и готовит из них посты на русском языке.

Статьи старше семи суток автоматически пропускаются. Если у материала нет даты, ограничено время ожидания в очереди.

Пошаговая инструкция: параллельные запросы к Gemini

Проблема, которую решает параллельность: при последовательных вызовах каждая следующая пачка анонсов ждёт, пока модель ответит на предыдущую. Между пачками нет зависимости по данным, поэтому ожидание бесполезно. Вот как его убрать.

  1. Задайте константы для размера пачки и числа параллельных запросов:
const BATCH_SIZE = 10;
const LITE_PARALLEL_BATCHES = 5;

При 50 анонсах в очереди получится пять независимых запросов по десять. Каждый запрос получает свой контекст, и модель, обрабатывающая первую пачку, не видит остальные четыре.

  1. Разделите входные анонсы на массивы по размеру пачки:
function splitIntoBatches(articles) {
  const batches = [];
  for (let i = 0; i < articles.length; i += BATCH_SIZE) {
    batches.push(articles.slice(i, i + BATCH_SIZE));
  }
  return batches;
}
  1. Сформируйте массив запросов для каждой пачки. Каждый элемент массива содержит URL Gemini API, заголовки и тело с промптом:
const requests = batches.map(batch => {
  const request = makeLiteRequest(batch);
  const { url, ...options } = request;
  return { url, ...options };
});
  1. Отправьте все запросы одновременно через UrlFetchApp.fetchAll() вместо fetch() в цикле:
const responses = UrlFetchApp.fetchAll(requests);

Это единственная строка, которая превращает последовательное ожидание в параллельное. GAS отправляет все HTTP-запросы разом и возвращает массив ответов.

  1. Обработайте ответы с проверкой ошибок для каждой пачки отдельно:
responses.forEach((response, index) => {
  if (response.getResponseCode() === 200) {
    const decisions = readLiteAnswer(response, batches[index]);
    // сохраняем решения
  } else {
    // логируем ошибку, пачка остаётся в очереди
  }
});

Если один из пяти запросов упал (квота, таймаут, ошибка API), остальные четыре всё равно обработаны. Неудавшаяся пачка остаётся в NewsInbox до следующего запуска.

В чём разница между пачкой и параллельностью?

Это два разных приёма, которые легко спутать:

  • Пачка внутри запроса означает, что вы передаёте модели сразу десять анонсов и просите вернуть десять решений. Вместо десяти обращений к API получается одно.
  • Параллельные запросы означают, что вы отправляете несколько таких пачек, не ожидая ответа на предыдущую. Количество обращений к API не уменьшается, но общее время сокращается.

В оригинальном решении оба приёма работают вместе: 50 анонсов разбиваются на 5 пачек по 10 и отправляются параллельно.

Что получилось на практике

До параллельности скрипт за один запуск успевал оценить только 10 анонсов из 32, а оставшиеся 22 ждали следующего цикла. Вот фрагмент реального отчёта из последовательной версии:

Оценено Lite: 10 | Ожидают (NewsInbox): 22 | Время: RSS 126 с, Lite 92 с | Статус: «Закончено время для Lite»

После перехода на fetchAll() те же 50 анонсов (5 пачек по 10) обрабатываются за время одного ответа модели, а не пяти. Экономия около 80 секунд позволяет уложиться в лимит GAS (6 минут на запуск) и не терять анонсы в очереди.

Частые ошибки
  • fetchAll() не отменяет квоты. У Gemini 2.5 Flash-Lite лимит 15 запросов в минуту. Пять параллельных запросов съедают треть минутной квоты за раз. Если запускать скрипт чаще двух раз в минуту, API начнёт возвращать ошибки 429.
  • Не проверять код ответа. Один упавший запрос из пяти не означает, что упали все. Но если не обрабатывать ошибки поштучно, можно потерять результаты удачных вызовов.
  • Путать пачку с параллельностью. Увеличение размера пачки (например, 50 анонсов в одном промпте) это другой приём. Модель может хуже справляться с длинным контекстом, а ответ на один запрос всё равно будет последовательным.
  • Забыть про очередь. Если скрипт упал на полпути, анонсы без очереди (NewsInbox) придётся заново скачивать из RSS. Очередь позволяет продолжить с того места, где произошёл сбой.

Что с этого вам прямо сейчас?

Авторам Дзена и копирайтерам. Схема напрямую адаптируется под мониторинг любой ниши: замените RSS-ленты на источники по вашей теме, а промпт отбора перепишите под критерии «полезно моей аудитории или нет». Готовый черновик поста на русском языке приходит в Telegram, даже если первоисточник на английском.

Маркетологам. Параллельные запросы к Gemini в Google Таблицах решают типичную задачу мониторинга конкурентов или трендов без платных SaaS-сервисов. Бесплатной квоты Gemini (500 запросов Flash-Lite в день) хватает на обработку нескольких сотен анонсов ежедневно.

Предпринимателям в РФ и СНГ. Gemini API доступен из России через VPN или прокси, но стабильность соединения зависит от конкретного провайдера. Как альтернативу для этапа генерации текстов можно рассмотреть YandexGPT API или GigaChat API, оба работают без ограничений по геолокации. Сам приём fetchAll() универсален и работает с любым HTTP API.

Мнение редакции dzen.guru

Решение ценно не кодом (его можно скопировать за минуту), а архитектурой. Google Таблица как база данных, GAS как бессерверный движок, Gemini как фильтр и переводчик, Telegram как интерфейс. Всё бесплатно, всё без «своего сервера». По моим наблюдениям, 90% авторов, которые хотят автоматизировать контент-мониторинг, останавливаются на этапе «а где хостить скрипт». Здесь ответ: нигде, Google хостит сам.

Честная оговорка: бесплатные квоты Gemini API могут измениться в любой момент, и Google не гарантирует SLA для бесплатного уровня. Для критичных рабочих процессов стоит заложить запасной сценарий с платным тарифом или альтернативной моделью.

Схема с параллельными запросами Gemini в Google Таблицах превращает обычную электронную таблицу в автономный конвейер, который сам читает RSS, фильтрует по смыслу, переводит и присылает готовое в Telegram. Попробуйте заменить RSS-ленты из примера на источники по вашей теме и посмотрите, сколько рутинного мониторинга можно снять с себя за один вечер настройки.

Научитесь работать с нейросетями на практике

В dzen.guru мы разбираем конкретные сценарии автоматизации для авторов и маркетологов, от промптов до готовых связок с Google Таблицами и Telegram.

Перейти на dzen.guru
Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

ai

Искусственный интеллект в медицине: Profluent ищет антибиотики за недели вместо лет

Компания Profluent, основанная выходцами из Salesforce Research, представила в июне 2025 года открытую платформу ProSAR-2, которая использует искусственный…

4 мин
MCP-протокол перегружает контекст модели: toolhub заменяет JSON-схемы деревом навигации
ai

MCP-протокол перегружает контекст модели: toolhub заменяет JSON-схемы деревом навигации

MCP протокол (Model Context Protocol, протокол контекста модели) обещает стандартизировать подключение инструментов к языковым моделям, но на практике…

6 мин
9 ошибок при внедрении AI в продукте: чек-лист из провалов российского EdTech
ai

9 ошибок при внедрении AI в продукте: чек-лист из провалов российского EdTech

Андрей Коптелов, бизнес-архитектор и менеджер образовательных продуктов, опубликовал на Хабре разбор девяти ошибок, которые допускают менеджеры при внедрении…

5 мин