Объедините все листы Excel в один новый лист

Мне нужна ваша помощь, у меня есть файл 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);
  }
}

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

Hovercraft Full Of Eels 07.03.2024 23:11

Есть ли строка заголовка на каждом листе?

taller 07.03.2024 23:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Если лист с именем «Объединить» существует, вам может потребоваться очистить лист перед сбором данных.
  • 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? Еще раз большое спасибо.

AmazingBand Proyect's 07.03.2024 23:57
They have 2 headings Означает ли это, что заголовок занимает две строки?
taller 08.03.2024 00:09

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

AmazingBand Proyect's 08.03.2024 00:36

Хотите сохранить имя запроса на объединенном листе?

taller 08.03.2024 00:52

Все работает отлично, большое спасибо за помощь, вы не представляете, как долго я пытался это сделать! Большое спасибо !

AmazingBand Proyect's 08.03.2024 16:01

Другие вопросы по теме