Не каждая задача по сбору данных требует 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 хорош как дашборд для просмотра результатов, а не как основной инструмент парсинга.
Есть идея? Реализуем
Разрабатываем проекты, которые решают задачи бизнеса — от лендинга до сложного сервиса. Расскажите о своей задаче, подберём решение.

