Парсинг в Google Sheets (Гугл Таблицы)

Парсинг прямо в Google Таблицах: IMPORTXML, IMPORTHTML, Apps Script — ограничения формул и что делать, когда их не хватает.

КP
Команда Parsing.agency
Сбор данных под задачи бизнеса
Опубликовано: 12 марта 2025

Если парсинг через Excel / VBA — это «настольный» путь, где данные тянутся скриптом прямо в книгу, то Google Sheets предлагает кое-что, чего у Excel из коробки нет: встроенные формулы-парсеры. Здесь во многих случаях не нужно писать ни строчки кода — достаточно вставить функцию в ячейку, и таблица сама загрузит данные с сайта и будет их обновлять.

А когда формул не хватает, на помощь приходит Google Apps Script — облачный аналог VBA на языке JavaScript. Он умеет делать HTTP-запросы, разбирать JSON и работать по расписанию, причём всё это крутится на серверах Google, а не на вашем компьютере.

В этой статье разберём оба уровня: сначала формулы для быстрого парсинга без кода, потом Apps Script для сложных задач.

Чем Google Sheets отличается от Excel / VBA

Сравнение помогает выбрать инструмент под задачу:

Критерий Excel / VBA Google Sheets
Парсинг формулой без кода Только Power Query IMPORTXML, IMPORTHTML и др.
Язык скриптов VBA Apps Script (JavaScript)
Где выполняется На вашем ПК В облаке Google
Запуск по расписанию Планировщик Windows + макрос Триггеры из коробки
Совместная работа Через файл Реальное время, ссылка
Готовые финансовые данные Нет GOOGLEFINANCE встроена
Лимиты на запросы Практически нет Есть квоты Google

Главный вывод: для лёгкого и среднего парсинга Google Sheets часто быстрее, потому что половина задач решается одной формулой. Для тяжёлых и нестандартных сценариев логика та же, что и в VBA, — меняется лишь синтаксис.

Уровень 1. Парсинг формулами

IMPORTHTML — таблицы и списки

Самая простая функция. Вытаскивает таблицу или список целиком по номеру:

code
=IMPORTHTML("https://example.com/page"; "table"; 1)

Аргументы: URL, тип элемента ("table" или "list") и его порядковый номер на странице. Если на странице несколько таблиц, перебирайте индекс (1, 2, 3...), пока не найдёте нужную. Результат «выливается» на соседние ячейки автоматически.

IMPORTXML — точечное извлечение по XPath

Самый мощный из формульных инструментов. Принимает URL и XPath-запрос — выражение, которое адресует конкретный элемент в разметке:

code
=IMPORTXML("https://example.com"; "//h1")
=IMPORTXML("https://example.com"; "//div[@class='price']")
=IMPORTXML("https://example.com"; "//span[@id='total']/text()")

Несколько полезных XPath-шаблонов:

Задача XPath
Все заголовки h2 //h2
Элемент по классу //div[@class='value']
Элемент по id //*[@id='price']
Атрибут (например, ссылку) //a/@href
Текст внутри тега //span[@class='cur']/text()
N-й элемент списка (//li)[3]

XPath проще всего подсмотреть в браузере: открыть «Инструменты разработчика» (F12), найти нужный элемент, правый клик → Copy → Copy XPath.

IMPORTDATA — CSV и TSV

Если источник отдаёт готовый CSV- или TSV-файл, тянем его напрямую:

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

Функция сама разложит значения по столбцам. Идеально для открытых датасетов и выгрузок.

IMPORTFEED — RSS и Atom

Для лент новостей и блогов:

code
=IMPORTFEED("https://example.com/rss")

GOOGLEFINANCE — финансы без парсинга вообще

Отдельно стоит выделить GOOGLEFINANCE — встроенный источник биржевых и валютных данных. Это тот случай, когда парсить ничего не надо: Google уже всё собрал за вас.

code
=GOOGLEFINANCE("NASDAQ:AAPL"; "price")
=GOOGLEFINANCE("CURRENCY:USDEUR")
=GOOGLEFINANCE("NASDAQ:GOOGL"; "price"; DATE(2024;1;1); DATE(2024;12;31); "DAILY")

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

Уровень 2. Google Apps Script

Формулы хороши, но у них есть потолок: они не умеют авторизоваться, обходить сложную защиту, разбирать вложенный JSON из API и выполнять ветвящуюся логику. Здесь начинается Apps Script.

Откройте таблицу → Расширения → Apps Script — и попадёте в облачный редактор кода. Это прямой аналог редактора VBA из материала про Excel, только на JavaScript.

HTTP-запрос: UrlFetchApp

Базовый запрос к странице или API:

javascript
function getResponse(url) {
  const options = {
    method: 'get',
    headers: {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
    },
    muteHttpExceptions: true   // не падаем на кодах 4xx/5xx
  };

  const response = UrlFetchApp.fetch(url, options);

  if (response.getResponseCode() === 200) {
    return response.getContentText();
  }
  return 'ERROR: ' + response.getResponseCode();
}

Сравните с функцией GetResponse из статьи про VBA — логика идентична: открыли запрос, подставили User-Agent, проверили код ответа. Меняется только обёртка: вместо MSXML2.XMLHTTP здесь UrlFetchApp.

Разбор JSON — нативно

Главное преимущество Apps Script над VBA: JSON разбирается одной встроенной командой, без самописных функций и сторонних модулей.

javascript
function getPrice(symbol) {
  const url = 'https://example-api.com/quote?symbol=' + symbol;
  const json = getResponse(url);

  const data = JSON.parse(json);   // одна строка вместо ExtractJsonValue
  return data.price;
}

В VBA для того же приходилось писать разбор строки вручную или подключать VBA-JSON. Здесь — JSON.parse, и сразу работаешь с объектом.

Запись результата на лист

Записываем данные в ячейки через объект листа:

javascript
function writeQuotes() {
  const tickers = ['AAPL', 'MSFT', 'GOOGL', 'TSLA'];
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // Заголовки
  sheet.getRange(1, 1, 1, 3).setValues([['Тикер', 'Цена', 'Время']]);

  const rows = [];
  const now = new Date();

  tickers.forEach(function (ticker) {
    const price = getPrice(ticker);
    rows.push([ticker, price, now]);
    Utilities.sleep(1000);   // пауза 1 сек между запросами
  });

  // Выгружаем всё одним вызовом — так быстрее
  sheet.getRange(2, 1, rows.length, 3).setValues(rows);
}

Принцип «собрать в массив и выгрузить одним вызовом» здесь так же важен для скорости, как и в VBA: setValues на весь диапазон работает в разы быстрее, чем запись по одной ячейке в цикле.

Парсинг HTML в Apps Script

Со встроенным разбором HTML сложнее: полноценного DOM-парсера, как HTMLDocument в VBA, в Apps Script нет. На практике используют либо регулярные выражения, либо извлечение текста между маркерами:

javascript
function extractByRegex(text, pattern) {
  const re = new RegExp(pattern);
  const match = text.match(re);
  return match ? match[1] : '';
}

// Пример: достать цену из "<span class='price'>152.34</span>"
// const price = extractByRegex(html, "class='price'>([\\d.]+)<");

Для сложной разметки иногда подключают сторонние библиотеки (например, Cheerio через сервис обёрток), но в большинстве задач регулярки или XPath-формула IMPORTXML справляются.

Кастомная функция для ячейки

Apps Script позволяет сделать собственную формулу, которую можно вызывать прямо из таблицы, как встроенную:

javascript
/**
 * Возвращает цену по тикеру.
 * @customfunction
 */
function MYPRICE(symbol) {
  return getPrice(symbol);
}

После сохранения в ячейке заработает =MYPRICE("AAPL"). У VBA есть похожая возможность через UDF, но здесь функция доступна сразу всем, у кого есть доступ к таблице.

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

В VBA для регулярного запуска нужен внешний планировщик Windows. В Google Sheets расписание встроено — это триггеры.

В редакторе Apps Script: иконка часов (Триггеры) → Добавить триггер → выбрать функцию, событие «По времени» и интервал (каждый час, каждый день и т. д.).

Или программно:

javascript
function setupTrigger() {
  ScriptApp.newTrigger('writeQuotes')
    .timeBased()
    .everyHours(1)
    .create();
}

Скрипт будет выполняться на серверах Google, даже когда ваш компьютер выключен и таблица закрыта. Для VBA-парсера такое недостижимо без постоянно работающей машины.

Лимиты и подводные камни

У облачного подхода своя цена — квоты Google:

  • Формулы IMPORT... обновляются периодически (примерно раз в час) и кэшируются. Для секундной актуальности они не годятся.
  • UrlFetchApp имеет суточный лимит вызовов (зависит от типа аккаунта — обычно тысячи запросов в день для бесплатного).
  • Время выполнения скрипта ограничено (порядка 6 минут на запуск для бесплатных аккаунтов). Длинный парсинг придётся разбивать на части.
  • #N/A и Loading... в формулах часто означают, что источник не отдал данные, сменил вёрстку или заблокировал запрос с серверов Google.

Эти ограничения — главная причина, по которой тяжёлый и частый парсинг иногда возвращают на «настольный» рельс из материала про Excel / VBA, где лимитов по запросам по сути нет.

Что выбрать: Sheets или Excel / VBA

Короткая шпаргалка:

  • Нужно быстро и без кода, данные в таблице, командная работа → Google Sheets и формулы.
  • Биржевые курсы и котировки → сначала GOOGLEFINANCE, и только если её мало — парсинг.
  • Автообновление без включённого ПК → Google Sheets с триггерами.
  • Большой объём, частые запросы, нет лимитов, сложный разбор HTMLExcel / VBA.
  • Корпоративная среда без облака, локальные данные → Excel / VBA.

Итог

Google Sheets закрывает два уровня парсинга одним инструментом. Формулы IMPORTHTML, IMPORTXML, IMPORTDATA и GOOGLEFINANCE решают типовые задачи без единой строки кода, а Apps Script с UrlFetchApp и нативным JSON.parse берёт на себя всё сложное — и делает это в облаке, по расписанию, без вашего компьютера.

По сравнению с подходом из материала про Excel / VBA логика остаётся той же — запрос, разбор, запись, обработка ошибок, — но синтаксис проще, JSON разбирается «из коробки», а автоматизация не требует внешнего планировщика. Платой за удобство становятся квоты Google: когда упираетесь в них, имеет смысл вернуться к настольному VBA-решению. Два инструмента не конкуренты, а дополняют друг друга — выбирайте под конкретную задачу.