Парсинг в Google Sheets: данные с любого сайта без кода

Не каждая задача по сбору данных требует Python и написания кода. Google Sheets умеет парсить данные с сайтов встроенными функциями: таблицы, списки, XML-данные. А для более сложных сценариев — есть Apps Script. Разберём все способы: от простого IMPORTHTML до автообновления данных по расписанию.

IMPORTHTML: парсим таблицы и списки

Функция IMPORTHTML извлекает HTML-таблицы (<table>) и списки (<ul>, <ol>) со страницы.

Синтаксис:

=IMPORTHTML(url; query; index)

  • url — адрес страницы
  • query — "table" или "list"
  • index — порядковый номер таблицы/списка на странице (начиная с 1)

Пример: курсы валют с сайта ЦБ РФ

=IMPORTHTML("https://www.cbr.ru/currency_base/daily/"; "table"; 1)

Эта формула вытащит таблицу курсов валют и разложит её по ячейкам таблицы. Данные обновляются автоматически (раз в час).

Пример: список самых популярных языков программирования

=IMPORTHTML("https://www.tiobe.com/tiobe-index/"; "table"; 1)

IMPORTXML: парсим через XPath

IMPORTXML — самый мощный инструмент. Позволяет извлекать любые элементы со страницы через XPath-запросы.

Синтаксис:

=IMPORTXML(url; xpath)

Основные XPath-выражения

XPath Что извлекает
//h1 Все заголовки h1 на странице
//title Тег title (заголовок вкладки)
//meta[@name='description']/@content Meta description страницы
//a/@href Все ссылки на странице
//div[@class='price']/text() Текст элементов с классом price
//img/@src URL всех изображений
(//h2)[1] Первый заголовок h2

Пример: SEO-аудит — собираем title и description конкурентов

# Ячейка A1 — URL сайта
# B1: заголовок страницы
=IMPORTXML(A1; "//title")

# C1: meta description
=IMPORTXML(A1; "//meta[@name='description']/@content")

# D1: количество h2 на странице
=COUNTA(IMPORTXML(A1; "//h2"))

Вставьте в столбец A список URL конкурентов, а в B и C — формулы. Получите SEO-обзор за минуту.

Пример: парсим цену товара

=IMPORTXML("https://example-shop.ru/product/123"; "//span[@class='product-price']")

Для определения правильного XPath: откройте страницу в Chrome, нажмите F12, найдите нужный элемент, правой кнопкой — Copy — Copy XPath.

IMPORTDATA: CSV и TSV файлы

IMPORTDATA загружает данные из CSV или TSV файлов по URL.

=IMPORTDATA("https://example.com/data/prices.csv")

Работает с любым URL, который возвращает текстовый файл с разделителями. Полезно для подключения к открытым API, которые отдают CSV.

IMPORTFEED: RSS-ленты

# Последние 10 публикаций из RSS
=IMPORTFEED("https://habr.com/ru/rss/best/"; "items title"; FALSE; 10)

Параметры: "items title" — заголовки записей, "items url" — ссылки, "items summary" — описания.

Ограничения встроенных функций

  • Лимит запросов — Google ограничивает количество IMPORT-вызовов на таблицу (около 50 одновременных)
  • Кэширование — данные обновляются раз в 1 – 2 часа, не в реальном времени
  • JavaScript — функции не выполняют JavaScript, поэтому SPA-сайты не парсятся
  • Блокировки — сайты могут блокировать запросы от Google Sheets (User-Agent: Google-Sheets)
  • Нестабильность — при изменении вёрстки сайта формулы перестают работать

Apps Script: парсинг без ограничений

Для сложных задач — Google Apps Script. Это JavaScript, встроенный в Google Sheets, с доступом к HTTP-запросам.

Доступ: Расширения → Apps Script

// Функция для парсинга цены с сайта
function parsePrice(url, selector) {
  try {
    const response = UrlFetchApp.fetch(url, {
      headers: {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
                      "AppleWebKit/537.36 Chrome/131.0.0.0 Safari/537.36"
      },
      muteHttpExceptions: true
    });

    const html = response.getContentText();

    // Простой парсинг через регулярку
    // (Apps Script не имеет DOM-парсера)
    const regex = new RegExp(selector + '[^>]*>([^<]+)<', 'i');
    const match = html.match(regex);

    if (match) {
      const priceText = match[1].replace(/[^\d.,]/g, '').replace(',', '.');
      return parseFloat(priceText);
    }
    return 'Не найдено';
  } catch (e) {
    return 'Ошибка: ' + e.message;
  }
}

// Используем в таблице: =parsePrice("https://example.com"; "class=\"price\"")

Парсинг нескольких страниц с записью в таблицу

function scrapeCompetitorPrices() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const urls = sheet.getRange("A2:A10").getValues().flat().filter(Boolean);

  urls.forEach((url, index) => {
    try {
      const response = UrlFetchApp.fetch(url, {
        headers: {
          "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
                        "AppleWebKit/537.36 Chrome/131.0.0.0 Safari/537.36"
        },
        muteHttpExceptions: true
      });

      const html = response.getContentText();
      const titleMatch = html.match(/<title>([^<]+)</);
      const title = titleMatch ? titleMatch[1].trim() : 'Без заголовка';

      // Ищем цену (общий паттерн: число с пробелами + ₽/руб)
      const priceMatch = html.match(/(\d[\d\s.,]+)\s*[₽руб]/);
      const price = priceMatch
        ? parseFloat(priceMatch[1].replace(/[\s,]/g, ''))
        : 'Не найдено';

      const row = index + 2;
      sheet.getRange(row, 2).setValue(title);
      sheet.getRange(row, 3).setValue(price);
      sheet.getRange(row, 4).setValue(new Date());

      Utilities.sleep(1000); // пауза между запросами
    } catch (e) {
      sheet.getRange(index + 2, 2).setValue('Ошибка: ' + e.message);
    }
  });
}

Автообновление по расписанию

Apps Script поддерживает триггеры — автоматический запуск функций по расписанию.

// Установка триггера: запуск каждый день в 9:00
function createDailyTrigger() {
  ScriptApp.newTrigger('scrapeCompetitorPrices')
    .timeBased()
    .atHour(9)
    .everyDays(1)
    .create();
}

// Для IMPORT-функций: принудительное обновление через подмену URL
// В ячейке: =IMPORTXML(A1 & "?t=" & B1; "//title")
// В B1: =INT(NOW()*24) — меняется каждый час, сбрасывая кэш

Другой способ — в Apps Script заменить формулу на значение и обратно:

function forceRefreshImports() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange("B1:B10");
  const formulas = range.getFormulas();

  range.clearContent();
  SpreadsheetApp.flush();
  Utilities.sleep(2000);

  range.setFormulas(formulas);
}

Практические сценарии

  • Мониторинг цен конкурентов — IMPORTXML + XPath на элемент с ценой, обновление по триггеру
  • SEO-аудит — сбор title, description, h1, количества ссылок с конкурентных сайтов
  • Курсы валют — IMPORTHTML с сайта ЦБ или IMPORTDATA с API
  • Отслеживание наличия товара — IMPORTXML на кнопку «В корзину» или текст «Нет в наличии»
  • Сбор отзывов — Apps Script для парсинга отзывов с маркетплейсов в таблицу

Когда Google Sheets недостаточно

Google Sheets — отличный инструмент для быстрого парсинга и прототипирования. Но для серьёзных задач — большие объёмы, SPA-сайты, обход защит — нужен Python с httpx или Playwright. Google Sheets хорош как дашборд для просмотра результатов, а не как основной инструмент парсинга.

Есть идея? Реализуем

Разрабатываем проекты, которые решают задачи бизнеса — от лендинга до сложного сервиса. Расскажите о своей задаче, подберём решение.

Написать в Telegram

27.03.2026

Нужна консультация?

Оставьте свои контактные данные, или свяжитесь с нами удобным для вас способом

Привет! Меня зовут Багира. Пишите, я все передам хозяевам!

Привет! Меня зовут Багира. Пишите, я все передам хозяевам!

Нажимая кнопку «Принять», вы соглашаетесь на сбор cookie. Мы используем их для обеспечения функционирования веб-сайта, аналитики действий и улучшения качества обслуживания. Если Вы не хотите, чтобы эти данные обрабатывались, отключите cookie в настройках браузера или прекратите использовать сайт.
Принять