(function()
{
//Вспомогательная функция, находит последний используемый ряд в данном листе. В отличии от остальных методов, не останавливается на пустых промежутках.
function FindLastRow(sheet)
{
// Minimum row index
let indexRowMin = 0;
// Maximum row index
let indexRowMax = 1048576;
// Column 'A'
let indexCol = 0;
// Row index for empty cell search
let indexRow = indexRowMax;
for (; indexRow >= indexRowMin; --indexRow) {
// Getting the cell
var range = sheet.GetRangeByNumber(indexRow, indexCol);
// Checking the value
if (range.GetValue() && indexRow !== indexRowMax) {
//Нашли первое значение, считая снизу, возвращаем его
return indexRow;
}
}
}
function CollectDataFromAllSheets() {
//Запоминаем листы, из которых нам надо собрать данные и добавляем лист для объединенных данных
let worksheets = Api.GetSheets();
if (worksheets.count == 0) {
return;
}
Api.AddSheet();
let allDataSheet = Api.ActiveSheet;
//Если требуется сохранять не в отдельный лист, а в отдельную книгу - то вместо предыдущей строчки используем:
/*
builder.CreateFile("xlsx");
let allDataSheet = Api.AddSheet();
*/
//копируем в итоговый лист заголовки столбцов из первого листа
worksheets[1].GetRows("1").Copy(allDataSheet.GetRows("1"));
//И устанавливаем текущую строку равной 2(сразу после заголовков)
let currentResultRow = 2;
//проходим по всем листам, из которых надо собрать данные
for (let ws of worksheets) {
//Для каждого листа находим последний ряд
let lastRow = FindLastRow(ws) +1;
//console.log("LastRow: ", lastRow);
//И копируем каждый ряд в конечную таблицу
for (let rowNum = 2; rowNum <= lastRow; rowNum++) {
//-2 потому что rowNum у нас тоже идет от 2
ws.GetRows(rowNum).Copy(allDataSheet.GetRows(rowNum + currentResultRow-2));
}
//После прохода по всем рядам - обновляем currentResultRow (можно и с помощью FindLastRow, но это будет значительно более затратно по вычислениям)
let rowCount = lastRow-1;
currentResultRow += rowCount;
}
}
CollectDataFromAllSheets();
})();