Меню

Ошибка объем импортируемых данных превышает максимальный

Использование importHTML и importXML для SEO Привет, друзья. Сегодня я хочу поделиться еще одной наработкой из большого списка регламентов и инструкций нашей студии «АлаичЪ и Ко». Среди моих коллег есть фанат работы с Гугл Таблицами – это Алексей Степанов, совместно с которым мы готовили для вас прошлую публикацию про написание seo-текстов и подготовки ТЗ для копирайтеров. Уверен, что и среди читателей блога много тех, кто использует Гугл Таблицы вместо Экселя. Сегодняшняя публикация для вас, ее Алексей подготовил без моей помощи, поэтому без долгих вступлений я сразу передаю слово ему.

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


Функция importHTML

С помощью функции importHTML можно настроить импорт данных из таблицы или списка на странице сайта.

Синтаксис

=IMPORTHTML(ссылка; запрос; индекс)

  • ссылка — ссылка на веб-страницу, включая протокол (http:// или https://),
  • запрос — значения «table» или «list», смотря, что нужно парсить (таблицу или список),
  • индекс – порядковый номер списка или таблицы (отсчет начинается с 1).

Пример:

IMPORTHTML("http://ru.wikipedia.org/wiki/Население_Индии"; "table"; 4)

Переменные можно разместить в ячейках, тогда формула изменится так:

IMPORTHTML(A2; B2; C2)


Примеры использования importHTML

Выгрузка любых табличных данных

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

Задача: выгрузить список всех городов России со страницы https://ru.wikipedia.org/wiki/Список_городов_России

Список городов в Википедии

Чтобы выгрузить данные из этой таблицы нам нужно указать в формуле ее порядковый номер в коде страницы. Чтобы этот номер узнать, нужно открыть код сайта (в нормальных браузерах это сочетание Ctrl+U, либо клавиша F12, открывающая панель разработчика). А дальше поиском по коду определить порядковый номер:

Определяем порядковый номер таблицы

В данном случае целевая таблица является первой в коде.

Составляем формулу:

=IMPORTHTML("https://ru.wikipedia.org/wiki/Список_городов_России";"table";1)

Результат:

Результат парсинга городов


Выгрузка данных из списка

Как-то я работал с интернет-магазином у которого была обширная структура и очень неудобное меню. Надо было бегло оценить текущую структуру сайта, чтобы понять ассортимент и возможные очевидные проблемы, типа дублирования пунктов меню. Меню было реализовано в виде списка, чем я и воспользовался. Меньше чем через минуту полная иерархия сайта отображалась у меня в Гугл Табличке.

Задача: выгрузить все пункты меню, оформленного тегами <ul>…</ul>.

Парсим меню сайта

Как и в первом примере для формулы понадобится определить порядковый номер списка в коде сайта. В данном случае — четвертый.

Определяем порядковый номер тега

Составляем формулу:

=IMPORTHTML("https://tools-markets.ru/";"list";3)

Результат:

Результат парсинга меню

Списки и таблицы — это хорошо, но чаще всего необходимо выдернуть с сайта информацию, оформленную другими тегами. Например, тексты, цены, заголовки и так дальше. Эти данные можно спарсить, используя формулу importXML, разберем ее подробнее.


Функция importXML

С помощью функции importXML можно настроить импорт данных из источников в формате XML, HTML, CSV, TSV, а также RSS и ATOM XML.

По сравнению с importHTML у данной функции гораздо более широкое применение. Она позволяет собирать практически любую информацию со страницы/документа, от частичных фрагментов до полного ее содержания. Ниже будут описаны примеры парсинга HTML-страниц сайта. Парсинг по файлам рассматривать не стану, т.к. такая задача возникает редко и большинство из вас с этим не столкнется никогда. Но если что, принцип работы везде одинаковый, главное понять суть.

Синтаксис

IMPORTXML(ссылка; "//XPath запрос")

  • ссылка – адрес веб-страницы с указанием протокола (http:// или https://). Значение этого параметра должно быть заключено в кавычки или представлять собой ссылку на ячейку, содержащую URL страницы.
  • //XPath запрос – то, что будем импортировать. Ниже мы разберем основные примеры запросов (а тут подробнее про XPath).

Пример:

IMPORTXML("https://en.wikipedia.org/wiki/Moon_landing"; "//a/@href")

Значения переменных можно хранить в ячейках, тогда формула будет такой:

IMPORTXML(A2; B2)


Примеры использования importХML

Пример 1. Импорт мета-тегов и заголовков со страниц

Самая простая и распространенная ситуация, которая может быть — узнать мета-теги или заголовки продвигаемых страниц. Для этих целей лучше подходит парсинг сайта специализированным софтом типа Comparser’a. Но бывают и исключения, например, если сайт очень большой и это сделать затруднительно, либо у вас нет под рукой программы. Или если вы собираетесь дальше использовать полученные данные в таблицах для мониторинга изменений мета-тегов и сверки целевых и фактических мета-тегов на страницах.

Формулы простые.

Получаем title страницы:

=importxml(A3;"//title")

Получаем title страницы

Получаем заголовки h1:

=importxml(A3;"//h1")

Получаем заголовки h1

Получаем description:

=importxml(A3;"//meta[@name='description']/@content")

Получаем description

Последняя формула получилась сложнее т.к. нас интересует значение не самого тега, а его атрибута:

  • ищем тег meta //meta
  • у которого есть атрибут name=’description’ [@name=’description’]
  • и парсим содержимое второго атрибута content /@content

Пример 2. Определяем наличие текста на странице и его длину в символах

Этот пример мне помог при работе с проектом, тексты для которого писал и размещал сам клиент, и ему было чрезвычайно лень сообщать мне о ходе процесса. Небольшой лайфхак с Гугл таблицами позволил мне мониторить динамику его работы, а ему с чистой совестью и дальше продолжать лениться и не сообщать мне ничего.

Рассмотрим ситуацию на примере нашего блога http://alaev.info, а конкретно на странице https://alaev.info/blog/post/6202. Если заглянуть в код, то мы увидим, что контент страницы расположен в теге <div> с классом entry.

Формула:

=LEN(concatenate(IMPORTXML(A1;"//div[@class='entry']")))

В ячейке А1 у нас ссылка на статью, в запросе XPath мы получаем содержимое тега div, у которого есть класс entry, то есть парсим весь текст страницы: =IMPORTXML(A1;"//div[@class='entry']")

Функция CONCATENATE (в русском варианте СЦЕПИТЬ) нужна, чтобы объединить все абзацы в один кусок контента. Без нее мы посчитаем только объем первого абзаца.

Функция LEN (в русском варианте ДЛСТР) считает количество символов.

Считаем количество символов


Пример 3. Выгружаем актуальные цены

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

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

Я решил рассмотреть похожую ситуацию на случайном сайте. Итак, допустим, мы хотим мониторить цены на автомобили и, скажем, выгружать актуальные цены с сайта http://centrmotors.lada.ru/. Вот пример товарной карточки http://centrmotors.lada.ru/ds/cars/granta/sedan/.

Чтобы настроить формулу снова идем в код сайта и смотрим в каких тегах располагается цена. Примеры должны быть простыми, поэтому я буду выгружать только минимальную цену.

Ищем цены на страницах

На данном сайте нам надо парсить содержимое тега <span> с id textspan7.

Формула:

=importxml(A2;"//span[@id='textspan7']")

В таблице ссылки на товары укажем в столбце А, а формулу вставим в столбец В.

Результат:

Результат парсинга цен

Поясню:

  1. A2 — номер ячейки из которой берется адрес страницы,
  2. //span[@id=’textspan7′] — блок из которого будем выводить информацию.
  3. Если бы у нас вместо span был div, а вместо id был бы class, то вторая часть формулы была такой: //div[@class='textspan7']

Автоматизируем дальше.

Приведенное выше решение не идеальное, ведь нам надо предварительно собрать адреса товарных страниц, а это довольно муторно. Если на сайт добавят новые модели авто, то информация по ним не будет подгружаться в таблицу т.к. адреса страниц будут отсутствовать в документе.

Подключив логику и другие формулы, можно хакнуть рутину. Ссылки на все модели присутствуют в главном меню. А если есть ссылки, то скорее всего их тоже можно спарсить.

Определяем ссылки в меню

И действительно, заглянув в код, мы увидим, что ссылки на товарные страницы располагаются в теге <p> c классом CMtext4:

Определяем теги в меню

Формула:

=IMPORTXML(A8;"//p[@class='CMtext4']/a/@href")

  • A8 – в этой ячейке ссылка на сайт,
  • p[@class=’CMtext4′] – тут мы ищем содержимое тега <p> с классом CMtext4,
  • /a/@href – а в этой части формулы мы уточняем, что из содержимого <p> хотим достать содержимое вложенного тега <a>, а если еще точнее, то ту часть, которая прописана в href=»».

После применения формулы в документе получится такой список:

Результат парсинга меню

Мы получили ссылки на все товары, которые нас интересуют. Осталось настроить парсинг цен по этим адресам. Но ссылки на страницы относительные, а нам обязательно нужны абсолютные ссылки, включающие имя домена. Чтобы подставить в ссылку домен используем функцию CONCATENATE.

Формула:

=IMPORTXML(concatenate("http://centermotors.lada.ru";A9);"//span[@id='textspan7']")

Либо при условии, что у нас в ячейке А8 находится адрес домена:

=IMPORTXML(concatenate(A$8;A9);"//span[@id='textspan7']")

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

Растягиваем формулу

Результат:

Конечный результат

Поясню, если кто-то еще не разобрался:

  • A$8 — ячейка, в которой указан домен сайта. Знаком $ фиксируем строку, чтобы это значение не изменилось, когда мы начнем протягивать формулу вниз.
  • A9 — это первый URL товарной страницы, при перетаскивании формулы значение автоматически меняется, т.е. в 10 строке у нас вместо A9 будет A10, в 11 строке A11 и т.д.

Теперь если на сайте будут добавлены или удалены товары, то в нашем файле ссылки на них автоматически обновятся, и мы будем всегда видеть только актуальную информацию.

Пример универсальный и имеет применение не только в рабочих целях. Например, можно мониторить цены на товары в ожидании скидок. А если еще немного потрудиться, то и настроить оповещение на почту при изменении цены (или любого другого значения) ниже/выше определенного значения.


Пример 4. Узнать количество товаров в категориях

Очень полезный прием для тех, кто хоть раз продвигал интернет-магазины без товаров. Нет, это не шутка! Мне доводилось пару раз, как бы это смешно ни звучало.

Например, движок сайта не отображает те товары, которых нет на складе (или сам клиент может удалять их вручную). В этом случае есть риск возникновения ситуации, когда на складе вообще не окажется определенного типа товаров и категории будут висеть пустые, в лучшем случае на странице будет текстовое описание.

Но с помощью парсинга легко узнать на каких страницах есть беда с ассортиментом.

Для примера возьмем сайт http://bz2.ru. Категории с товарами выглядят вот так http://bz2.ru/katalog/generatory-dizelnye/dizelnye-generatory-100-kvt/.

Чтобы посчитать количество товаров идем в код сайта и смотрим какими тегами оформлены товары.

Определяем теги оформления товаров

Товар оформлен в теге <div> с классом product, заголовок товара оформлен в теге <div> с классом title. Я решил посчитать заголовки:

Формула:

=COUNTA(IMPORTXML(A3;"//div[@class='title']"))

Результат:

Результат парсинга товаров

COUNTA нужна, чтобы подсчитать число значений, если бы мы не использовали эту функцию, то результат был бы таким:

Парсинг заголовков товаров

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


Пример 5. Парсим код ответа сервера

Я очень редко встречаю сайты, где что-то постоянно отваливается, но все же бывает. В случае необходимости можно быстро проверить все продвигаемые страницы на доступность и корректный ответ сервера.

Обычно я такие вещи мониторю с помощью скриптов без использования формул, но с помощью рассматриваемой функции это можно реализовать. Данный способ, пожалуй, единственное исключение из общего списка примеров, потому что я к нему не прибегал ни разу, но уверен, что кому-то из вас он пригодится.

В сети много сервисов, которые проверяют страницы на код ответа сервера. Суть идеи в том, чтобы парсить данные с такого сервиса. Для примера я решил взять самый популярный — http://www.bertal.ru/ — если мы проверим в нем страницу, то он отобразит результат по URL вида https://bertal.ru/index.php?a4789763/alaev.info/blog/post/6202#h.

Я не знаю, что означают символы a4789763, но на результат они не влияют. Смотрим:

Парсинг кода ответа сервера

Формула:

=importxml(concatenate(A$4;A6);"//div[@id='otv']/b")

Результат:

Результат парсинга кода ответа сервера

  • A$4 — адрес ячейки с неизменяемой частью URL,
  • A6 — ячейка с адресом страницы, код ответа, которой хотим проверить.

Функцией CONCATENATE склеиваем наши куски в один URL с которого и парсим данные.


Пример 6. Узнаем количество страниц в индексе ПС

Если мы введем в поисковик запрос типа [site:http://alaev.info], то узнаем сколько всего страниц данного сайта находится в выдаче.

Парсинг количества результатов в Яндексе

Результаты будут выведены на странице типа https://yandex.ru/search/?text=site%3Ahttp%3A%2F%2Falaev.info&lr=213, где после [https://yandex.ru/search/?text=site%3A] следует адрес сайта и необязательный параметр региона поиска [&lr=213].

Все, что нам нужно — это сформировать URL, по которому поисковик отдаст нам ответ, и определить из каких тегов парсить эту инфу.

В данном случае данные лежат в теге <div> с классом serp-adv__found.

Если мы поместим ссылку на сайт в ячейку A15, то формула будет такая:

=importxml(CONCATENATE("<a href="https://yandex.ru/search/?text=site%3A%22;A15">https://yandex.ru/search/?text=site%3A";</a>A15);"//div[@class='serp-adv__found']")

Результат:

Результат парсинга Яндекса

В таком виде результат не особо ценен, т.к. желательно не только узнать количество страниц, но и провести какие-то дальнейшие вычисления или сравнения. Для этого модернизируем формулу и приведем текстовое значение в числовое.

Для этих целей будем использовать функцию SUBSTITUTE (в русском варианте ПОДСТАВИТЬ). Суть идеи в том, чтобы убрать слово [Нашлось: ] и заменить надпись [тыс. результатов] на [000], чтобы в итоге надпись выглядела как просто число 2000.

Но есть нюанс. Окончание меняется в зависимости от результата, например, может выглядеть как [Нашёлся 1 результат], поэтому такие вариации тоже надо будет заменить.

Не буду вас утомлять, поэтому ближе к делу: сначала заменим надпись [Нашлось: ] на пустоту вот так:

=SUBSTITUTE(ссылка;"Нашлось ";"")

Дальше заменим [тыс. результатов] на [000] для этого добавим еще одну аналогичную функцию, и формула будет выглядеть так:

=SUBSTITUTE(SUBSTITUTE(ссылка;"Нашлось ";"");"тыс.";"000")

Проделаем тоже самое для остальных вариантов и вместо слова [ссылка] пропишем функцию импорта. Конечная формула будет следующей:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(importxml(CONCATENATE("https://yandex.ru/search/?text=site%3A";A10);"//div[@class='serp-adv__found']");"Нашлось ";"");" результатов";"");" результата";"");" ";"");"Нашлась";"");"результат";"");"Нашёлся";"");"тыс.";"000")

Немного пугающе, правда? Возможно, есть более элегантные решения, но так как данный вариант универсальный и полностью рабочий, то я остановился на нем. Если вы найдете более красивое решение, то поделитесь в комментариях, мне будет интересно увидеть другие возможные построения формулы.


Ограничения

Минусом использования данных функций является то, что большие объемы данных обработать не получится. Существуют ограничение на число исходящих запросов, и если вам нужно, например, послать 1000 запросов, то вы столкнетесь с ситуацией, когда в большинстве ячеек у вас будет находиться надпись «Loading». Точных цифр Google не приводит, но по личному наблюдению — за один раз можно отправить около 100 запросов, после чего происходит таймаут примерно на 1 час до отправки следующей партии запросов. Поэтому вам подойдет этот функционал только в том случае, если не планируется обработка больших объемов данных.


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

Для меня возможности данных функций незаменимы для выполнения простых задач. Надеюсь, что и для вас эта информация оказалась полезной и позволит победить рутину в повседневных задачах.

Если у вас есть на заметке интересные примеры, обязательно делитесь в комментариях!

Спасибо за внимание. И до связи!

Using the answer of Sam and reading documentation, I found the way how to get result of BIG DATA without error. For that you need to make an export step by step. In one query. For example if you need to export data sheet!A3:X100000.

Try to do the following:
first make a query and select only

=QUERY(importrange("link_sheet", "sheet!A3:X10000"), "select *", 0);

after get result just edit query from

=QUERY(importrange("link_sheet", "sheet!A3:X10000"), "select *", 0);  

to

=QUERY(importrange("link_sheet", "sheet!A3:X20000"), "select *", 0); 

after getting data edit a query again

=QUERY(importrange("link_sheet", "sheet!A3:X300000"), "select *", 0); 

and continue while you won’t rich

=QUERY(importrange("link_sheet", "sheet!A3:X100000"), "select *", 0);

with that way I could to import around 800 000 cells with data. For my task it was enough, but I think If I need longer result data, I could continue and it will works.

You should also remember that Google Spreadsheets have a limit on one document maximum can have only 2 million cells.

Using the answer of Sam and reading documentation, I found the way how to get result of BIG DATA without error. For that you need to make an export step by step. In one query. For example if you need to export data sheet!A3:X100000.

Try to do the following:
first make a query and select only

=QUERY(importrange("link_sheet", "sheet!A3:X10000"), "select *", 0);

after get result just edit query from

=QUERY(importrange("link_sheet", "sheet!A3:X10000"), "select *", 0);  

to

=QUERY(importrange("link_sheet", "sheet!A3:X20000"), "select *", 0); 

after getting data edit a query again

=QUERY(importrange("link_sheet", "sheet!A3:X300000"), "select *", 0); 

and continue while you won’t rich

=QUERY(importrange("link_sheet", "sheet!A3:X100000"), "select *", 0);

with that way I could to import around 800 000 cells with data. For my task it was enough, but I think If I need longer result data, I could continue and it will works.

You should also remember that Google Spreadsheets have a limit on one document maximum can have only 2 million cells.

Дополнительная информация о функциях импорта

В Google Таблицах доступны функции импорта, позволяющие оптимизировать работу с таблицами. К ним относятся:

  • IMPORTHTML
  • IMPORTDATA
  • IMPORTFEED
  • IMPORTXML
  • IMPORTRANGE

Лимиты на использование

Если функции импорта потребляют слишком много трафика, появится следующее сообщение: «Ошибка. Из-за большого количества запросов загрузка данных может занять некоторое время. Советуем сократить число функций IMPORTHTML, IMPORTDATA, IMPORTFEED и IMPORTXML в созданных таблицах».

Для владельцев документов действуют строгие ограничения в отношении работы с таблицами. Именно поэтому таким пользователям необходимо разумно использовать формулы и функции в таблицах. В квоте также может учитываться изменение, внесенное соавтором.

Чтобы устранить сообщения об ошибках, уменьшите количество изменений в исходном диапазоне, из которого импортирована функция. Например, если разрешенное значение для исходного диапазона в функции =IMPORTDATA(исходный диапазон) часто обновляется, вы должны разрешить внешние вызовы. Они, в свою очередь, могут привести к снижению скорости загрузки.

Актуальность данных

Чтобы данные в таблицах поддерживались в актуальном состоянии и это не препятствовало работе с ними, в отношении функций IMPORTDATA, IMPORTHTML и IMPORTXML действуют следующие правила:

  • Все три функции автоматически проверяют наличие обновлений каждый час, пока документ открыт, даже если в формулу и лист не вносились изменения.
  • Если вы удаляете и повторно добавляете ячейки или перезаписываете их с помощью одной и той же формулы, функции обновляются.

Важно! Если вы откроете и обновите документ, это не приведет к обновлению функций.

Пересчитываемые функции

При использовании функции импорта в ячейке может отобразиться надпись «#ERROR!» с сообщением «Ошибка. В качестве аргумента этой функции нельзя указать ячейку, содержащую строки NOW(), RAND() или RANDBETWEEN()«.

Чтобы избежать чрезмерного потребления трафика, функции импорта не могут напрямую или косвенно ссылаться на пересчитываемую функцию, такую как NOW, RAND или RANDBETWEEN, поскольку она часто обновляются.

Если вы получили указанное выше сообщение об ошибке, но все равно хотите посмотреть результаты пересчитываемой функции, скопируйте их. Для этого нажмите Специальная вставкаand thenТолько значения.

Важно! После этого все значения станут статичными. Например, если вы скопируете результат функции NOW и вставите только значения, они не будут обновляться.

Примечание. Единственным исключением является пересчитываемая функция TODAY, которая обновляется один раз в день.

Сообщение об ошибке «Результат слишком большой»

Если вы получили это сообщение при использовании функции IMPORTXML, сократите объем данных, который возвращает запрос XPATH.

Статьи по теме

  • IMPORTFEED
  • IMPORTXML
  • IMPORTHTML
  • IMPORTDATA
  • IMPORTRANGE

Эта информация оказалась полезной?

Как можно улучшить эту статью?

Я пытаюсь импортировать данные из файла .csv, находящегося на моем Google Диске. Это файл csv с; как разделители. Размер файла составляет около 4 МБ. 46 столбцов и 8770 строк. Его можно вручную загрузить в мою электронную таблицу, но мне нужно, чтобы он был подключен через importdata или аналогичную функцию и обновил.

Когда я пытаюсь импортировать файл, я получаю сообщение о том, что содержимое URL превышает максимальный размер. Обрезка вложенной формулы array_constrain не помогает.

Моя электронная таблица содержит некоторые конфиденциальные данные, поэтому я решил сделать фиктивный csv, чтобы проиллюстрировать проблему и посмотреть, есть ли у вас то же самое:

Вот массив случайных чисел 50 000 строк и 30 столбцов (1 500 000 ячеек). Это файл размером 5,61 МБ. Ссылка для скачивания, которую я использую: https://drive.google.com/uc?export=download&id= 19MBtGO-O7PV4NNojLAcxm-Pg8ZwjFXI8

Файл находится здесь:
https://drive.google.com/file/ d / 19MBtGO-O7PV4NNojLAcxm-Pg8ZwjFXI8 / view? usp = sharing

Когда я пытаюсь обратиться к нему с помощью IMPORTDATA, он сообщает, что он превышает размер, но его можно загрузить вручную через меню.

enter image description here

Вы можете поиграть здесь с этим файлом:
https://docshecke.com/support/docs/docs/product/docs/docs/docs/docs/docs/docs/docs/docs/docs, изменить? usp = sharing

Согласно этой дискуссии, он должен работать в любом случае до 2000000 ячеек: https: // webapps. stackexchange.com/questions/10824/whats-the-biggest-csv-file-you-can-import-into-a-google-sheets

1 ответ

Лучший ответ

Если никто не придумал решение формулы для таблиц Google, вы можете просто использовать Utilities.parseCsv (csv):

function getBigCsv() {
  const sheet = SpreadsheetApp.getActive().getSheetByName('Arkusz2');
  const url = 'https://drive.google.com/uc?export=download&id=19MBtGO-O7PV4NNojLAcxm-Pg8ZwjFXI8';
  const csv = UrlFetchApp.fetch(url);
  const data = Utilities.parseCsv(csv);
  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}

И если вы хотите, чтобы данные обновлялись, вы можете настроить триггер по времени для обновления данных.


2

Marios
27 Янв 2021 в 11:29

Вопрос

Я пытаюсь выполнить IMPORTRANGE из диапазона, содержащего 240 000 ячеек (40 столбцов и 6 000 строк). Функция IMPORTRANGE выдает ошибку «Результаты слишком велики».
Я не могу найти документацию по ограничениям этой функции.

Каковы ограничения функции IMPORTRANGE?

Как я могу обойти это, чтобы я мог импортировать эти данные в свой лист?

George Hyde

Ответ на вопрос

14-го февраля 2017 в 10:01

2017-02-14T10:01:26+00:00

#37759634

У меня тоже была похожая проблема.

Попробуйте разделить диапазон импорта с помощью формулы массива.

Пример:

становится

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

Решение / Ответ

Sam McEwin

2-го февраля 2017 в 10:23

2017-02-02T22:23:01+00:00

#37759633

Мои эксперименты показывают, что существует максимальное ограничение на количество элементов, которые вы можете импортировать с помощью функции importrange(), которое не связано с общим количеством ячеек в вашем листе Google.

Эта цифра, похоже, составляет около 175 000 ячеек. Я не уверен, что это официальное максимальное значение, но это самое большее, что я смог импортировать без получения ошибки ‘слишком большой’.

Danny Dillon

Ответ на вопрос

8-го марта 2017 в 2:43

2017-03-08T14:43:32+00:00

#37759635

Пустые ячейки могут быть фактором. Мы наблюдали разрушение импортного диапазона при 23573×11 или 259 тыс. ячеек, типичный рост составляет 10 или около того строк ежедневно, так что мы уже давно превысили 250 тыс. ячеек. Один столбец в основном пустой, в паре других есть несколько пустых.

Я не смог заставить ARRAYFORMULA разобрать данные, как показано выше, или с другими предположениями, поэтому я использовал это в скрытой вкладке «Ingest».

=importrange("Лист", "A1:K10000") в ячейке A1
=importrange("Лист", "A10001:K") в ячейке A10001

Моя рабочая вкладка/вкладка презентации использует

чтобы обеспечить постоянное форматирование, наши исходные листы перезаписываются ежедневно.

Mikhailov Vladimir

Ответ на вопрос

27-го апреля 2018 в 11:04

2018-04-27T11:04:14+00:00

#37759637

Используя ответ Сэма и читая документацию, я нашел способ, как получить результат BIG DATA без ошибок. Для этого нужно сделать экспорт шаг за шагом. В одном запросе. Например, если вам нужно экспортировать данные sheet!A3:X100000.

Попробуйте сделать следующее:
сначала сделайте запрос и выберите только

после получения результата просто отредактируйте запрос с

на

после получения данных отредактируйте запрос еще раз

и продолжать, пока вы не разбогатеете

Таким образом я смог импортировать около 800 000 ячеек с данными. Для моей задачи этого было достаточно, но я думаю, если мне понадобятся более длинные данные, я смогу продолжить и это сработает.

Вы также должны помнить, что у Google Spreadsheets есть ограничение на то, что в одном документе может быть не более 2 миллионов ячеек.

 Jerry

Ответ на вопрос

23-го мая 2017 в 7:24

2017-05-23T19:24:55+00:00

#37759636

Из моего опыта использования IMPORTRANGE, количество ячеек не было причиной вообще, но каждый раз, когда я превышал 36 столбцов, он терпел неудачу. Мои результаты могли быть 600 строк или 6000 строк до тех пор, пока я не превышал 36 столбцов. Как ни странно, это можно обойти, комбинируя функции IMPORTRANGE.

Пример: =QUERY({IMPORTRANGE("Spreadsheet_Key", "Sheet1!A:AI") , IMPORTRANGE("Spreadsheet_Key", "Sheet1!AJ:AM")}, "WHERE Col38= 'test'").

Обратите внимание на скобки {}, используемые до и после двух функций IMPORTRANGE

I created a custom import function that overcomes all limits of IMPORTXML I have a sheet using this in about 800 cells and it works great.

It makes use of Google Sheet’s custom scripts (Tools > Script editor…) and searches through content using regex instead of xpath.

function importRegex(url, regexInput) {
  var output = '';
  var fetchedUrl = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText();
    if (html.length && regexInput.length) {
      output = html.match(new RegExp(regexInput, 'i'))[1];
    }
  }
  // Grace period to not overload
  Utilities.sleep(1000);
  return output;
}

You can then use this function like any function.

=importRegex("https://example.com", "<title>(.*)</title>")

Of course, you can also reference cells.

=importRegex(A2, "<title>(.*)</title>")

If you don’t want to see HTML entities in the output, you can use this function.

var htmlEntities = {
  nbsp:  ' ',
  cent:  '¢',
  pound: '£',
  yen:   '¥',
  euro:  '€',
  copy:  '©',
  reg:   '®',
  lt:    '<',
  gt:    '>',
  mdash: '–',
  ndash: '-',
  quot:  '"',
  amp:   '&',
  apos:  '''
};

function unescapeHTML(str) {
    return str.replace(/&([^;]+);/g, function (entity, entityCode) {
        var match;

        if (entityCode in htmlEntities) {
            return htmlEntities[entityCode];
        } else if (match = entityCode.match(/^#x([da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
        } else if (match = entityCode.match(/^#(d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
};

All together…

function importRegex(url, regexInput) {
  var output = '';
  var fetchedUrl = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText();
    if (html.length && regexInput.length) {
      output = html.match(new RegExp(regexInput, 'i'))[1];
    }
  }
  // Grace period to not overload
  Utilities.sleep(1000);
  return unescapeHTML(output);
}

var htmlEntities = {
  nbsp:  ' ',
  cent:  '¢',
  pound: '£',
  yen:   '¥',
  euro:  '€',
  copy:  '©',
  reg:   '®',
  lt:    '<',
  gt:    '>',
  mdash: '–',
  ndash: '-',
  quot:  '"',
  amp:   '&',
  apos:  '''
};

function unescapeHTML(str) {
    return str.replace(/&([^;]+);/g, function (entity, entityCode) {
        var match;

        if (entityCode in htmlEntities) {
            return htmlEntities[entityCode];
        } else if (match = entityCode.match(/^#x([da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
        } else if (match = entityCode.match(/^#(d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
};

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка обработки документа на сервере экватор
  • Ошибка обращения к утилите егаис крипто лес что делать яндекс