Всем привет, меня зовут Артем Медведев, я представляю компанию Helpexcel.pro. Мы занимаемся созданием управленческих таблиц и умеем их интегрировать с другими приложениями.
На самом деле очень много задач, связанных с управленческими отчетами можно решить без программирования. Мы периодически публикуем материалы о том, как самостоятельно создать управленческий учет в Гугл таблицах. Делюсь тут ссылкой на соответствующий раздел сайта. Там пошаговая инструкция с разбором формул.
Кейс:
У каждого сотрудника своя таблица, где записываются учетные операции. Нужно сделать так, что бы в одной таблице собиралась информация из таблиц сотрудников в один сводный отчет.
Прикрепляю небольшой видеообзор итогового решения, что бы было понятней о чем речь)
Вот ссылка на папку с таблицами, которые будет описаны далее.
Рассмотрим ситуацию, когда с целью разграничения прав у каждого сотрудника своя таблица, где фиксируются учетные операции.
И есть таблица руководителя, содержащая форму отчета.
Усложним задачу тем, что представление данных в таблице руководителя задается взаимосвязанными выпадающими списками и диапазонами дат.
Шаг 1
Для начала нужно сделать так, что бы данные, которые водятся в таблицы сотрудников появлялись в таблице руководителя.
Для этого создаем в таблице руководителя ровно столько листов, сколько таблиц сотрудников. Данные будем подтягивать формулой IMPORTRANGE()
Посмотрите короткий обзор применения формулы в данной ситуации.
В таблице «Отчетность» на листе «Данные» поставьте курсор в ячейку D3 и пропишите там формулу по аналогии с видеозаписью.
Подробнее о формуле:
=IMPORTRANGE(«Ссылка на таблицу»; «Диапазон, который нужно отобразить из этой таблицы»)
Обязательно заключайте аргументы в кавычки!
Пример функции:
=importrange(«https://docs.google.com/spreadsheets/d/14GIMUMieJBNiUGFEcukx0q0VwhdjzzQ_6R_JSWXbzNs/edit #gid=0″;»Данные!b:g»)
Для самопроверки воспользуйтесь готовой формулой
Шаг 2
В шаге 1 мы сделали так, что бы при обновлении данных в таблицах сотрудников, в таблице руководителя отображались все изменения.
Теперь нужно сделать так, что бы отчет заполнялся актуальными данными из таблиц сотрудников.
Для этого хорошо подходить формула СУММЕСЛИМН()
Подробнее о формуле:
=СУММЕСЛИМН(диапазон суммирования;диапазон критерия 1; критерий 1; диапазон критерия 2; критерий 2;…)
И эту формулу нужно приписать относительно каждой таблицы.
Вид формулы в ячейке отчета:
= СУММЕСЛИМН1+СУММЕСЛИМН2+СУММЕСЛИМН3…СУММЕСЛИМНN
Про формулу СУММЕСЛИМН и про то как ее использовать для разных вычислений напишу статью немного позже.
А пока прикрепляю запись вебинара, где мы очень подробно разбираем IMPORTRANGE, СУММЕСЛИМН, ЕСЛИ, FILTER для создания модели отчета.
Если хотите получить записи курса по Гугл таблицам, то можно посмотреть информацию на этой страничке.
Google Spreadsheet.
I dynamically remove old sheet and I create (I use sheet.copyTo() function) a new sheet with the same name, but IMPORTRANGE formula can’t find (periodically) new Sheets.
=ImportRange("ssId", "Data!A1:B1")
This script works fine but other Spreadsheets which fetch data from this Spreadsheet by IMPORTRANGE formula periodically can’t find new (generated) sheets:
=QUERY(IFERROR(IMPORTRANGE("ssId", "Data!A:AU")),"SELECT * ", 0)
This formula doesn’t return anything!
function copySpreadSheet(sourceId, targetId) {
try {
var sourceSS = SpreadsheetApp.openById(sourceId);
SpreadsheetApp.setActiveSpreadsheet(sourceSS);
var sourceSheets = sourceSS.getSheets();
var targetSS = SpreadsheetApp.openById(targetId);
SpreadsheetApp.setActiveSpreadsheet(targetSS);
var targetSheets = targetSS.getSheets();
//you can't delete all sheets!
var timestamp = new Date().getTime();
var tempName = "TEMPORARY-FOR-DELETE-" + timestamp;
targetSS.insertSheet(tempName);
for(var i = 0; i < targetSheets.length; i++) {
targetSS.deleteSheet(targetSheets[i]);
}
var sourceCharts = [];
var newSheetCharts = [];
var newSheet = null;
var newSheetName = "";
for(var i = 0; i < sourceSheets.length; i++) {
newSheet = sourceSheets[i].copyTo(targetSS)
newSheetName = newSheet.getName().replace("Copy of ", "");
newSheet.setName(newSheetName);
/*
newSheetCharts = newSheet.getCharts();
sourceCharts = sourceSheets[i].getCharts();
for(var j = 0; j < sourceCharts.length; j++) {
/* Server Error:
var chart = newSheetCharts[j].modify()
.setChartType(sourceCharts[j].getType())
.addRange(sourceCharts[j].getRange())
.build();
newSheet.updateChart(chart);
*/
//insertImage(blob, column, row, offsetX, offsetY)
/*
newSheet.insertImage(
sourceCharts[j].getBlob(),
sourceCharts[j].getContainerInfo().getAnchorColumn(),
sourceCharts[j].getContainerInfo().getAnchorRow(),
sourceCharts[j].getContainerInfo().getOffsetX(),
sourceCharts[j].getContainerInfo().getOffsetY()
);
*/
/* } */
}
targetSS.deleteSheet(targetSS.getSheetByName(tempName)); //remove a temporary sheet
//Adding Date Stamp:
targetSS.insertSheet("Last time updated").hideSheet().getRange(1, 1).setValue(new Date());
SpreadsheetApp.flush();
Utilities.sleep(500);
return targetSS;
} catch (err) {
Logger.log(err.toString());
}
}
I tried to «cheat» the Spreadsheet:
var querySheet = dataSourceSS.getSheetByName("Query");
querySheet.activate();
Logger.log(formula);
querySheet.getRange(2, 1).setFormula("=Minute(Now())"); //any FORMULA
Utilities.sleep(1000);
querySheet.getRange(2, 1).setFormula(formula);
It still doesn’t work!
Google Spreadsheet.
I dynamically remove old sheet and I create (I use sheet.copyTo() function) a new sheet with the same name, but IMPORTRANGE formula can’t find (periodically) new Sheets.
=ImportRange("ssId", "Data!A1:B1")
This script works fine but other Spreadsheets which fetch data from this Spreadsheet by IMPORTRANGE formula periodically can’t find new (generated) sheets:
=QUERY(IFERROR(IMPORTRANGE("ssId", "Data!A:AU")),"SELECT * ", 0)
This formula doesn’t return anything!
function copySpreadSheet(sourceId, targetId) {
try {
var sourceSS = SpreadsheetApp.openById(sourceId);
SpreadsheetApp.setActiveSpreadsheet(sourceSS);
var sourceSheets = sourceSS.getSheets();
var targetSS = SpreadsheetApp.openById(targetId);
SpreadsheetApp.setActiveSpreadsheet(targetSS);
var targetSheets = targetSS.getSheets();
//you can't delete all sheets!
var timestamp = new Date().getTime();
var tempName = "TEMPORARY-FOR-DELETE-" + timestamp;
targetSS.insertSheet(tempName);
for(var i = 0; i < targetSheets.length; i++) {
targetSS.deleteSheet(targetSheets[i]);
}
var sourceCharts = [];
var newSheetCharts = [];
var newSheet = null;
var newSheetName = "";
for(var i = 0; i < sourceSheets.length; i++) {
newSheet = sourceSheets[i].copyTo(targetSS)
newSheetName = newSheet.getName().replace("Copy of ", "");
newSheet.setName(newSheetName);
/*
newSheetCharts = newSheet.getCharts();
sourceCharts = sourceSheets[i].getCharts();
for(var j = 0; j < sourceCharts.length; j++) {
/* Server Error:
var chart = newSheetCharts[j].modify()
.setChartType(sourceCharts[j].getType())
.addRange(sourceCharts[j].getRange())
.build();
newSheet.updateChart(chart);
*/
//insertImage(blob, column, row, offsetX, offsetY)
/*
newSheet.insertImage(
sourceCharts[j].getBlob(),
sourceCharts[j].getContainerInfo().getAnchorColumn(),
sourceCharts[j].getContainerInfo().getAnchorRow(),
sourceCharts[j].getContainerInfo().getOffsetX(),
sourceCharts[j].getContainerInfo().getOffsetY()
);
*/
/* } */
}
targetSS.deleteSheet(targetSS.getSheetByName(tempName)); //remove a temporary sheet
//Adding Date Stamp:
targetSS.insertSheet("Last time updated").hideSheet().getRange(1, 1).setValue(new Date());
SpreadsheetApp.flush();
Utilities.sleep(500);
return targetSS;
} catch (err) {
Logger.log(err.toString());
}
}
I tried to «cheat» the Spreadsheet:
var querySheet = dataSourceSS.getSheetByName("Query");
querySheet.activate();
Logger.log(formula);
querySheet.getRange(2, 1).setFormula("=Minute(Now())"); //any FORMULA
Utilities.sleep(1000);
querySheet.getRange(2, 1).setFormula(formula);
It still doesn’t work!
Google Sheet IMPORTRANGE Ошибка «Внутренняя ошибка диапазона импорта», когда диапазон представляет собой просто столбец
«Внутренняя ошибка диапазона импорта».
=IMPORTRANGE(«https://docs.google.com/spreadsheets/d/1-bCoiKLjBlM5IGRo9wrdm», «sheet1!B:C») , работает.
Это ошибка? до сих пор это был третий раз, когда мне приходилось менять их много раз? Есть ли какое-нибудь последовательное решение для этого? Я использую это решение временно
5 ответов
Это не могло быть решением проблемы. Я построил целую платформу интеграции данных на листах и сильно полагаюсь на функциональность importrange для защиты доступа к источникам данных от пользователей. Теперь в последнее время #REF начал преследовать мои столы повсюду, и он делает все более или менее непригодным для использования.
Однозначно это ошибка или нехватка ресурсов.
Я думаю, что лучшим решением здесь будет использовать
Я не верю, что уклонение от кеша Google — это исправление или даже обходной путь.
Мы поддерживаем лист с функцией importrange на нескольких вкладках в течение многих лет, и только в течение последней недели возникла проблема.
Мы впервые заметили это в пятницу, а сегодня снова вернулись. В обоих случаях я не думаю, что сделал что-либо, чтобы исправить проблему, особенно сегодня. Я переместил формулу по листу, что привело к обновлению функции importrange, но это все равно привело к «внутренней ошибке диапазона импорта». Функция importrange отключилась на время (я не знаю, сколько сегодня, но я думаю, что это было не менее 15 минут), а затем разрешилась на всех вкладках без изменений.
Я думаю, что это определенно ошибка или Google возится с вещами на сервере. Может, нам нужно найти способ сделать все без использования importrange?
Эти ошибки обычно временные и проходят через несколько часов. Чтобы ускорить это, немного измените формулу импорта, заменив «sheet1!B:B» на «sheet1!B:b» — изменения регистра строчных букв достаточно, чтобы позволить вызову утилизировать кеш Google и получить свежие результаты, что должно позволить вам обойти проблему. .
В дополнение к двойному ответу вы также должны ограничить свой диапазон, чтобы не было большого количества мертвых строк. Так что что-то вроде B:B5000 вместо B:B .
у нас есть несколько листов, которые полагаются на importrange для получения данных из других листов Google, начиная с этой недели у нас возникли проблемы с загрузкой некоторых из них, мы просто получаем внутреннюю ошибку #ref import range.
Я пробовал множество решений, но все они, похоже, работают только временно, после чего при обновлении запроса иногда удается получить данные, размер диапазона не является проблемой, поскольку проблема возникает как при большом импорте, так и при импорте. которые получают только 1 ячейку.
пока лучшее решение, которое у меня есть, это удалить = из формулы, а затем добавить его обратно, чтобы снова загрузить данные, однако это длится всего около 30 минут, прежде чем importrange возвращается к той же ошибке.
в формулах нет ничего необычного
Я пробовал варианты заглавных букв для диапазонов, а также добавлял, если ошибка, чтобы попытаться загрузить вариант формулы
но, похоже, ничего не работает, а когда работает, решение не прилипает.
будем очень признательны за любую помощь или понимание того, что может быть причиной этой проблемы.
Как обойти ошибку IMPORTRANGE: «Результаты слишком велики»?
Я пытаюсь IMPORTRANGE из диапазона, содержащего 240 000 ячеек (40 столбцов и 6000 строк). Функция IMPORTRANGE ошибочна: «Результаты слишком велики». Я не могу найти документацию о ограничениях функции.
Каковы ограничения IMPORTRANGE?
Как мне обойти это, чтобы я мог импортировать эти данные в свой листок?
4 ответа
У меня тоже была аналогичная проблема.
Попробуйте разделить диапазон импорта с помощью формулы массива.
Протестируйте это с помощью разных размеров данных, чтобы получить самую короткую версию, и вы можете делать то, что вам нужно.
Пустые клетки могут иметь значение. Мы наблюдали нарушение импорта в ячейках 23573×11 или 259k, типичный рост составлял около 10 рядов ежедневно, поэтому мы некоторое время находились в ячейках более 250 тысяч. Один столбец в основном пустой, у пары других есть несколько пробелов.
Я не мог заставить ARRAYFORMULA разобрать, как показано выше, или с другими догадками, поэтому я использовал это на своей скрытой вкладке «Ingest».
=importrange(«sheet», «A1:K10000») в ячейке A1
=importrange(«sheet», «A10001:K») в ячейке A10001
В моей рабочей /презентационной вкладке используется
, чтобы обеспечить постоянное форматирование, наши исходные листы перезаписываются ежедневно.
Используя ответ Сэма и документацию для чтения, я нашел способ получить результат BIG DATA без ошибок. Для этого вам нужно сделать шаг за шагом. В одном запросе. Например, если вам нужно экспортировать данные sheet!A3:X100000 .
Попробуйте сделать следующее: сначала сделайте запрос и выберите только
после получения результата просто отредактируйте запрос из
после получения данных снова отредактировать запрос
и продолжайте, пока вы не будете богаты
таким образом я мог бы импортировать около 800 000 ячеек с данными. Для моей задачи этого было достаточно, но я думаю, что если мне нужны более длинные данные результата, я мог бы продолжить, и он будет работать.
Вы также должны помнить, что таблицы Google имеют ограничение на один максимум документа, может содержать только 2 миллиона ячеек.
Из моего опыта использования IMPORTRANGE количество ячеек не было причиной вообще, но в любое время, когда я превысил 36 столбцов, это не получилось. Мои результаты могут составлять 600 строк или 6000 строк, если я не превысил 36 столбцов. По иронии судьбы вы можете обойти это, объединив функции IMPORTRANGE.
Обратите внимание на фигурные скобки , используемые до и после двух функций IMPORTRANGE
Импортирует диапазон ячеек из одной электронной таблицы в другую.
Пример использования
IMPORTRANGE("
https://docs.google.com/spreadsheets/d/abcd123abcd123
", "лист1!A1:C10")
IMPORTRANGE(A2,"B2")
Синтаксис
IMPORTRANGE(url_таблицы, диапазон)
-
url_таблицы
– URL таблицы, из которой импортируются данные.- Значение
url_таблицы
должно быть текстом, заключенным в кавычки, или ссылкой на ячейку, в которой содержится таблица.
- Значение
-
диапазон
– строка в формате"[название_листа!]диапазон"
(например,"Лист1!A2:B6"
или"A2:B6"
). Этот параметр указывает на диапазон, который нужно импортировать.-
Компонент
название_листа
в параметредиапазон
не является обязательным. По умолчаниюIMPORTRANGE
импортирует данные из заданного диапазона первого листа. -
Значение параметра
диапазон
должно быть текстом, заключенным в кавычки, или ссылкой на ячейку, которая содержит необходимую информацию.
-
Технические сведения и рекомендации
Если изменить исходный документ, функция IMPORTRANGE
обеспечит обновление всех открытых принимающих документов. При этом на экране появится полоса зеленого цвета. Кроме того, функция IMPORTRANGE
возвращает результаты в принимающий документ только после того, как в исходном документе будут завершены все расчеты, даже если в указанном диапазоне никаких расчетов нет.
Рекомендации
- Не используйте слишком много принимающих листов: каждый из них должен получать данные с исходного листа.
- Измените структуру и размер результата перед использованием функции
IMPORTRANGE
, особенно при импорте из часто обновляемой таблицы.- Допустим, вам необходимо посчитать сумму для 1 миллиона строк, импортированных из другой таблицы. Быстрее рассчитать сумму в исходной таблице, а затем использовать функцию
IMPORTRANGE
, чтобы импортировать результат, чем использовать функциюIMPORTRANGE
для непосредственного импорта 1 миллиона строк данных и подсчета результата в конечной таблице. Этот метод позволяет сжать и объединить данные до импорта с помощью функцииIMPORTRANGE
.
- Допустим, вам необходимо посчитать сумму для 1 миллиона строк, импортированных из другой таблицы. Быстрее рассчитать сумму в исходной таблице, а затем использовать функцию
Функция IMPORTRANGE
позволяет обновлять данные на других листах, если они привязаны к исходному. Если на листе Б содержится функция IMPORTRANGE(лист А)
, а на листе В – функция IMPORTRANGE(лист Б)
, то при внесении изменений в данные на листе А будут также обновлены листы Б и В. Любые изменения на листе А приведут к перезагрузке листов Б и В.
Рекомендации
- Ограничивайте количество последовательно связанных функцией
IMPORTRANGE
листов. - Старайтесь не применять циклы в функции
IMPORTRANGE
. Например, цикл возникнет, если вы используете функциюIMPORTRANGE
в нескольких таблицах, ссылающихся друг на друга: таблица A использует функциюIMPORTRANGE
для получения данных из таблицы Б, а таблица Б использует функциюIMPORTRANGE
для получения данных из таблицы А. Это приводит к тому, что таблицы зацикливаются, постоянно пытаются получить друг от друга данные, но никогда не выдают результат. - Изменения, внесенные на исходном листе, могут появиться на принимающем листе не сразу. Если функция
IMPORTRANGE
используется много раз в нескольких связанных документах, то от момента внесения изменений на исходном листе до появления результатов на принимающем листе может пройти немало времени.
Функция IMPORTRANGE
выполняется при первом открытии документа или если документ был открыт не более 5 минут назад. Как и в случае с цепочкой обновлений, функция IMPORTRANGE
вынуждена обращаться к каждому документу, из которого импортируются данные.
Рекомендации
- Помните, что для обновления задействованных вами документов может потребоваться некоторое время. По возможности используйте меньше цепочек в рамках функции
IMPORTRANGE
.
Разрешение и доступ
Когда таблица 1 впервые импортирует данные из таблицы 2 при выполнении функции IMPORTRANGE
, система запрашивает разрешение на доступ к информации.
При попытке импортировать данные из вашей таблицы с помощью функции IMPORTRANGE
появляется следующее сообщение:
- Подождите, пока выполняется функция
IMPORTRANGE
. - Появляется сообщение об ошибке #REF! с текстом «Необходимо связать листы.»
- Нажмите Разрешить доступ.
Если вы пытаетесь использовать функцию IMPORTRANGE
для импорта данных из таблицы, которая вам не принадлежит, то через несколько секунд появится следующее сообщение:
- В браузере введите URL исходной таблицы.
- Запросите доступ к таблице.
- Дождитесь, пока владелец таблицы разрешит вам доступ к ней.
После получения разрешения все редакторы таблицы 1 смогут использовать IMPORTRANGE
для импорта любых данных из таблицы 2. Разрешение будет действовать до тех пор, пока пользователь, давший его, не будет лишен прав доступа к таблице 2. Учтите, что предоставление доступа к принимающему листу учитывается в ограничении в 600 пользователей общего диска, которое действует для исходного листа.
Производительность
Функция IMPORTRANGE
использует внешние данные, как и функции IMPORTXML
и GOOGLEFINANCE
. Это означает, что для работы функции необходимо подключение к интернету. Google Таблицы скачивают весь нужный диапазон на компьютер и на их работе скажется низкая скорость подключения к интернету. При этом действует ограничение на объем полученных данных (10 МБ для одного запроса). Если функция IMPORTRANGE
работает медленно, попробуйте уменьшить размер диапазонов, которые следует импортировать. Вы также можете перенести сводные расчеты в исходный документ. Это позволит вам перемещать меньше данных в листы, находящиеся на компьютере, и выполнять больше расчетов удаленно.
Примечание. Вам доступны другие похожие инструменты. Apps Script может принимать данные из других документов и срабатывать при внесении изменений или по расписанию. Подключенные таблицы обновляются по расписанию и больше подходят для загрузки и импорта крупных наборов данных.
Лимиты на использование
Если функция IMPORTRANGE
использует большой объем трафика, в ячейке может появиться сообщение «Загрузка…» и подробное сообщение об ошибке с текстом «Ошибка. Загрузка данных может занять некоторое время из-за большого количества запросов. Советуем сократить число функций IMPORTHTML
, IMPORTDATA
, IMPORTFEED
и IMPORTXML
в созданных таблицах».
Ограничения касаются автора документа. Пользователю стоит учитывать количество всех функций импорта данных во всех создаваемых документах. На расходование лимита также могут повлиять изменения, которые вносят другие соавторы.
Чтобы сообщение об ошибке больше не выводилось, рекомендуем сократить число запросов на обновление данных. Например, если разрешенное значение для аргумента в функции =IMPORTDATA(аргумент)
часто обновляется, это может привести к большому числу внешних запросов, которые снижают скорость обработки данных.
Актуальность данных
Google Таблицы гарантируют пользователям быстрое обновление данных в Таблицах при разумном использовании. Функция IMPORTRANGE
автоматически проверяет наличие обновлений каждый час, пока документ открыт, даже если в формулу и таблицу не вносились изменения. Если вы удаляете, повторно добавляете или редактируете ячейки с помощью одной и той же формулы, то функция обновляется. Когда вы открываете и перезагружаете документ, функция IMPORTRANGE
не обновляется.
Пересчитываемые функции
При использовании функции IMPORTRANGE
вы можете увидеть сообщение #ERROR! с текстом «Ошибка. Функция не может ссылаться на ячейку с функцией NOW
, RAND
или RANDBETWEEN
.» Функции импорта не могут напрямую или косвенно ссылаться на пересчитываемую функцию, такую как NOW
, RAND
или RANDBETWEEN
. Этим предотвращается чрезмерное использование трафика в таблице пользователя, поскольку такие функции часто обновляются.
Примечание. Единственным исключением является пересчитываемая функция TODAY
, которая обновляется один раз в день.
Рекомендуем ознакомиться с информацией по ссылкам ниже:
- Скопируйте результаты пересчитываемых функций.
- Используйте меню Специальная вставкаТолько значения.
- Затем используйте ссылки на эти статические значения.
При этом все значения станут статическими. Например, если вы скопируете и вставите результат функции NOW
как значение, то оно больше не будет изменяться.
Если у вас остались вопросы, вы можете посетить справочный форум Редакторов Документов.
Похожие функции
IMPORTXML
: Импорт данных из источников в формате XML, HTML, CSV, TSV, а также RSS и ATOM XML..
IMPORTHTML
: Импортирует данные из таблицы или списка на веб-странице..
IMPORTFEED
: Импортирует фид RSS или Atom..
IMPORTDATA
: Импортирует данные в формате CSV (значения, разделенные запятыми) или TSV (значения, разделенные табуляцией). Для импорта необходимо указать ссылку на источник данных..
Подробнее о том, как оптимизировать ссылки на данные…
Эта информация оказалась полезной?
Как можно улучшить эту статью?