Мне нужна ваша помощь, у меня есть файл Excel типа .xlsx, который был автоматически отправлен из системы на мою электронную почту, этот Excel поставляется с информацией, распределенной на нескольких вкладках в одном файле, я хочу создать сценарий Office, который берет информацию с каждого листа и объединяет ее в один лист. Как только все данные будут скопированы, удалите все листы, и в файле останется одна вкладка со всеми объединенными данными. Спасибо за вашу помощь.
function main(workbook: ExcelScript.Workbook) {
// Get all the worksheets in the workbook
let sheets = workbook.getWorksheets();
// Create a new worksheet named "Consolidate"
let consolidateSheet = workbook.getWorksheet("Consolidate") || workbook.addWorksheet("Consolidate");
// Loop through each sheet in the workbook
for (let sheet of sheets) {
// Get the data range of the current sheet
let dataRange = sheet.getUsedRange();
// Get the values from the data range
let values = dataRange.getValues();
// Find the last row with data in the Consolidate sheet
let lastRow = consolidateSheet.getUsedRange().getRowCount();
// Get the range where the data will be pasted in the Consolidate sheet
let targetRange = consolidateSheet.getRange(lastRow + 1, 1, values.length, values[0].length);
// Paste the values into the Consolidate sheet
targetRange.setValues(values);
}
}
Есть ли строка заголовка на каждом листе?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


let values = dataRange.getValues() включает строку заголовка, тогда на листе консолидации будет несколько заголовков.getRangeByIndexes() и getRange() разные.function main(workbook: ExcelScript.Workbook) {
// Get all the worksheets in the workbook
let sheets = workbook.getWorksheets();
const sumShtName = "Consolidate";
// Create a new worksheet named "Consolidate"
let consolidateSheet = workbook.getWorksheet(sumShtName) || workbook.addWorksheet(sumShtName);
// Clear sheet
consolidateSheet.getRange().clear(ExcelScript.ClearApplyTo.all);
// Loop through each sheet in the workbook
for (let sheet of sheets) {
// Get the data range of the current sheet
if (sheet.getName() != sumShtName) {
let dataRange = sheet.getUsedRange();
let colCount = dataRange.getColumnCount();
let rowCount = dataRange.getRowCount();
// Copy table header
if (!consolidateSheet.getRange("A1").getText()) {
consolidateSheet.getRange("A1").copyFrom(dataRange.getAbsoluteResizedRange(1, colCount))
}
// Get the values from the data range, skip headser
let values = dataRange.getOffsetRange(1, 0).getResizedRange(-1, 0).getValues();
// Find the last row with data in the Consolidate sheet
let lastRow = consolidateSheet.getUsedRange().getRowCount();
// Get the range where the data will be pasted in the Consolidate sheet
let targetRange = consolidateSheet.getRangeByIndexes(lastRow, 0, values.length, colCount);
// Paste the values into the Consolidate sheet
targetRange.setValues(values);
sheet.delete();
}
}
}
Обновлять:
function main(workbook: ExcelScript.Workbook) {
// Get all the worksheets in the workbook
let sheets = workbook.getWorksheets();
const sumShtName = "Consolidate";
const headerRows = 2;
// Create a new worksheet named "Consolidate"
let consolidateSheet = workbook.getWorksheet(sumShtName) || workbook.addWorksheet(sumShtName);
// Clear sheet
consolidateSheet.getRange().clear(ExcelScript.ClearApplyTo.all);
// Loop through each sheet in the workbook
for (let sheet of sheets) {
// Get the data range of the current sheet
if (sheet.getName() != sumShtName) {
let dataRange = sheet.getUsedRange();
let colCount = dataRange.getColumnCount();
let rowCount = dataRange.getRowCount();
// Copy table header
if (!consolidateSheet.getRange("A1").getText()) {
consolidateSheet.getRange("A1").copyFrom(dataRange.getOffsetRange(headerRows-1,0).getAbsoluteResizedRange(1, colCount))
}
// Get the values from the data range, skip headser
let values = dataRange.getOffsetRange(headerRows, 0).getResizedRange(-1 * headerRows, 0).getValues();
// Find the last row with data in the Consolidate sheet
let lastRow = consolidateSheet.getUsedRange().getRowCount();
// Get the range where the data will be pasted in the Consolidate sheet
let targetRange = consolidateSheet.getRangeByIndexes(lastRow, 0, values.length, colCount);
// Paste the values into the Consolidate sheet
targetRange.setValues(values);
sheet.delete();
}
}
}
concat для консолидации данных и одновременной записи данных в лист более эффективно.function main(workbook: ExcelScript.Workbook) {
// Get all the worksheets in the workbook
let sheets = workbook.getWorksheets();
const sumShtName = "Consolidate";
const headerRows = 2;
// Create a new worksheet named "Consolidate"
let consolidateSheet = workbook.getWorksheet(sumShtName) || workbook.addWorksheet(sumShtName);
// Clear sheet
consolidateSheet.getRange().clear(ExcelScript.ClearApplyTo.all);
let allValues: (string | number | boolean)[][] = [];
let bFristSht: boolean = true;
// Loop through each sheet in the workbook
for (let sheet of sheets) {
// Get the data range of the current sheet
if (sheet.getName() != sumShtName) {
let dataRange = sheet.getUsedRange();
let values: (string | number | boolean)[][] = [];
if (bFristSht) {
// Get table with header from the 1st sheet
values = dataRange.getOffsetRange(headerRows - 1, 0).getResizedRange(1 - headerRows, 0).getValues();
bFristSht = !bFristSht;
} else {
// Get table w/o header
values = dataRange.getOffsetRange(headerRows, 0).getResizedRange(-headerRows, 0).getValues();
}
allValues = allValues.concat(values);
// sheet.delete
}
}
// Get the range where the data will be pasted in the Consolidate sheet
let targetRange = consolidateSheet.getRangeByIndexes(0, 0, allValues.length, allValues[0].length);
// Paste the values into the Consolidate sheet
targetRange.setValues(allValues);
console.info(allValues);
}
Большое спасибо за ваш ответ! Код сработал отлично! Теперь все данные копируются на новый лист «Консолидация». Не могли бы вы применить это ко мне: «пусть значения = dataRange.getValues() включают строку заголовка, тогда на листе консолидации есть несколько заголовков». листы имеют 2 заголовка: в строке А1 отображается заголовок запроса, а в строке А2 — заголовок каждого столбца. Можно ли с этим параметром копировать со второго листа только данные после А2? Еще раз большое спасибо.
They have 2 headings Означает ли это, что заголовок занимает две строки?
На каждом листе в первой строке указано название запроса, по всей таблице это поле со слиянием всех данных, а во второй строке — заголовки каждого столбца. Да, я знаю, это немного странно, но именно так система отправляет данные.
Хотите сохранить имя запроса на объединенном листе?
Все работает отлично, большое спасибо за помощь, вы не представляете, как долго я пытался это сделать! Большое спасибо !
Вы отметили этот вопрос как вопрос, связанный с Java, но я не вижу очевидной значимости, поэтому вы, возможно, захотите объяснить, какое отношение это имеет к программированию на Java. Кроме того, вы опубликовали код, но, возможно, захотите объяснить его подробнее: как он делает то, что вы хотите, чего не делает, подробности вашего кода и вашей проблемы. Кроме того, вы ищете кого-нибудь, кто напишет для вас код?