Добрый день. Есть документ с несколькими листами, таблицы в нем идентичны по структуре, строки на листах периодически добавляются. Нужно с помощью скрипта (формулы никак не подойдут) собирать данные с этих листов в один общий лист. На форуме не удалось найти нужное решение, при этом очень понравился скрипт от Gustav, где данные берутся из разных документов, но знаний, чтобы адаптировать эту идею под свои потребности, к сожалению, не хватает.
Добрый день. Есть документ с несколькими листами, таблицы в нем идентичны по структуре, строки на листах периодически добавляются. Нужно с помощью скрипта (формулы никак не подойдут) собирать данные с этих листов в один общий лист. На форуме не удалось найти нужное решение, при этом очень понравился скрипт от Gustav, где данные берутся из разных документов, но знаний, чтобы адаптировать эту идею под свои потребности, к сожалению, не хватает.d-141
Сообщение отредактировал d-141 - Суббота, 04.04.2020, 11:01
Нужно с помощью скрипта (формулы никак не подойдут) собирать данные с этих листов в один общий лист.
А почему формулы так категорически не подойдут? Если у Вас все листы - и первичные, и сводный - в одном файле, то речь тогда не идёт об иногда нерасторопных IMPORTRANGE. Для связи внутри одного файла есть масса других функций.
Поддерживаю Сергея в плане файла примера (ссылки на расшареную Гугл-таблицу). Причем, постарайтесь сделать такой примерчик, чтобы он в дальнейшем остался в открытом доступе - для грядущих поколений. А то в этом разделе много тем, в которых авторы после получения решения закрывали свои файлы от посторонних глаз, тем самым обесценивая топики, особенно если решения были приведены внутри этих файлов - т.е. после обсуждения не оставалось ничего полезного Спасибо за понимание!
Нужно с помощью скрипта (формулы никак не подойдут) собирать данные с этих листов в один общий лист.
А почему формулы так категорически не подойдут? Если у Вас все листы - и первичные, и сводный - в одном файле, то речь тогда не идёт об иногда нерасторопных IMPORTRANGE. Для связи внутри одного файла есть масса других функций.
Поддерживаю Сергея в плане файла примера (ссылки на расшареную Гугл-таблицу). Причем, постарайтесь сделать такой примерчик, чтобы он в дальнейшем остался в открытом доступе - для грядущих поколений. А то в этом разделе много тем, в которых авторы после получения решения закрывали свои файлы от посторонних глаз, тем самым обесценивая топики, особенно если решения были приведены внутри этих файлов - т.е. после обсуждения не оставалось ничего полезного Спасибо за понимание!Gustav
Извините, что сразу не приложила пример. Тогда немного конкретизирую задачу: есть Таблица 1, содержащая несколько листов (в файле примера три листа), а также Таблица 2, в которую нужно свести все данные из листов первого файла. Не рассматриваю для решения формулы, т.к. это постоянная подгрузка, а хотелось бы иметь возможность работать с фалом Таблица 2 без дополнительных "тормозов".
Извините, что сразу не приложила пример. Тогда немного конкретизирую задачу: есть Таблица 1, содержащая несколько листов (в файле примера три листа), а также Таблица 2, в которую нужно свести все данные из листов первого файла. Не рассматриваю для решения формулы, т.к. это постоянная подгрузка, а хотелось бы иметь возможность работать с фалом Таблица 2 без дополнительных "тормозов".d-141
Добавил свою скриптовую версию в Таблицу 2. Вызов - через меню "Моё меню". Скрипт - безусловный (пока, во всяком случае), т.е. на листе "Свод 2" все данные сначала удаляются, а затем происходит заполнение этого листа всеми данными с листов Таблицы 1.
[vba]
Код
function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Моё меню') .addItem('Объединить данные из листов таблицы 1', 'getUnionSheetsDataFromAnotherFile') .addToUi(); } function getUnionSheetsDataFromAnotherFile() { var ssSource = SpreadsheetApp.openById('1vRD9CvmhgI3D8C36w6lzEYNwPN2kPeb7zCJdbIuUV-g'); var strAddr = 'A2:C'; var dataAll = []; ['Лист1','Лист2','Лист3'].forEach(function(sh) { var range = ssSource.getSheetByName(sh).getRange(strAddr); var dataOne = range.getValues().filter(function(row) { return row[0] }); dataAll = dataAll.concat(dataOne); }); if (!dataAll.length) return; // если массив пустой, то досрочно завершаем процесс var shSvod = SpreadsheetApp.getActive().getSheetByName('Свод 2'); // устанавливаем лист вставки массива данных, сформированного выше if (shSvod.getMaxRows() > 10) shSvod.deleteRows(11, shSvod.getMaxRows()-10); // вначале урезаем лист вставки до некоторого минимального кол-ва строк shSvod.getRange(strAddr) // устанавливается диапазон A2:C (после возможного выше удаления строк) .clearContent() // очистка содержимого установленного диапазоне A2:C .offset(0, 0, dataAll.length) // изменение размера диапазона - под диапазон вставляемого массива (при нехватке строк - они автоматически добавляются) .setValues(dataAll) // вставка значений из массива .offset(0, 0, 1) // устанавливается диапазон A2:C2 (одна строка) - для последующего копирования формата .copyTo(shSvod.getRange(strAddr), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); // копирование только формата из диапазона A2:C2 в переопределенный диапазон A2:C }
[/vba]
Добавил свою скриптовую версию в Таблицу 2. Вызов - через меню "Моё меню". Скрипт - безусловный (пока, во всяком случае), т.е. на листе "Свод 2" все данные сначала удаляются, а затем происходит заполнение этого листа всеми данными с листов Таблицы 1.
[vba]
Код
function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Моё меню') .addItem('Объединить данные из листов таблицы 1', 'getUnionSheetsDataFromAnotherFile') .addToUi(); } function getUnionSheetsDataFromAnotherFile() { var ssSource = SpreadsheetApp.openById('1vRD9CvmhgI3D8C36w6lzEYNwPN2kPeb7zCJdbIuUV-g'); var strAddr = 'A2:C'; var dataAll = []; ['Лист1','Лист2','Лист3'].forEach(function(sh) { var range = ssSource.getSheetByName(sh).getRange(strAddr); var dataOne = range.getValues().filter(function(row) { return row[0] }); dataAll = dataAll.concat(dataOne); }); if (!dataAll.length) return; // если массив пустой, то досрочно завершаем процесс var shSvod = SpreadsheetApp.getActive().getSheetByName('Свод 2'); // устанавливаем лист вставки массива данных, сформированного выше if (shSvod.getMaxRows() > 10) shSvod.deleteRows(11, shSvod.getMaxRows()-10); // вначале урезаем лист вставки до некоторого минимального кол-ва строк shSvod.getRange(strAddr) // устанавливается диапазон A2:C (после возможного выше удаления строк) .clearContent() // очистка содержимого установленного диапазоне A2:C .offset(0, 0, dataAll.length) // изменение размера диапазона - под диапазон вставляемого массива (при нехватке строк - они автоматически добавляются) .setValues(dataAll) // вставка значений из массива .offset(0, 0, 1) // устанавливается диапазон A2:C2 (одна строка) - для последующего копирования формата .copyTo(shSvod.getRange(strAddr), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); // копирование только формата из диапазона A2:C2 в переопределенный диапазон A2:C }
Добавил свою скриптовую версию в Таблицу 2. Вызов - через меню "Моё меню". Скрипт - безусловный (пока, во всяком случае), т.е. на листе "Свод 2" все данные сначала удаляются, а затем происходит заполнение этого листа всеми данными с листов Таблицы 1.
По поводу сбора данных по условию не написала изначально, поэтому просить его было бы наверное уже наглостью.
Очень помогли обоими решениями, побегу применять. Большое спасибо!
Ого, даже целых два решения. Безгранично благодарна.
Добавил свою скриптовую версию в Таблицу 2. Вызов - через меню "Моё меню". Скрипт - безусловный (пока, во всяком случае), т.е. на листе "Свод 2" все данные сначала удаляются, а затем происходит заполнение этого листа всеми данными с листов Таблицы 1.
По поводу сбора данных по условию не написала изначально, поэтому просить его было бы наверное уже наглостью.
Очень помогли обоими решениями, побегу применять. Большое спасибо!d-141