Office Script开发需求:合并Excel多工作表为单一表并删除原工作表
Office Script:合并多工作表并删除原表
针对将分散在多个工作表的业务数据合并到新工作表、并删除所有原工作表的需求,以下是完整的实现代码:
function main(workbook: ExcelScript.Workbook) { // 获取所有工作表 let sheets = workbook.getWorksheets(); // 创建或获取名为"合并结果"的工作表 let consolidateSheet = workbook.getWorksheet("合并结果") || workbook.addWorksheet("合并结果"); // 清空合并表原有数据(避免重复执行时数据冗余) consolidateSheet.getUsedRange()?.clear(ExcelScript.ClearApplyTo.all); let hasHeader = false; // 标记是否已写入表头 // 遍历每个工作表 for (let sheet of sheets) { // 跳过合并结果表本身 if (sheet.getName() === consolidateSheet.getName()) { continue; } // 获取当前工作表的已用数据范围,空表直接跳过 let dataRange = sheet.getUsedRange(); if (!dataRange) { continue; } let values = dataRange.getValues(); // 获取合并表当前的最后数据行号 let lastRow = consolidateSheet.getUsedRange()?.getRowCount() || 0; // 处理表头:仅保留第一个工作表的表头,后续表跳过表头行 if (!hasHeader) { let targetRange = consolidateSheet.getRange(lastRow + 1, 1, values.length, values[0].length); targetRange.setValues(values); hasHeader = true; } else { // 跳过表头,只写入数据行 if (values.length > 1) { let dataOnly = values.slice(1); let targetRange = consolidateSheet.getRange(lastRow + 1, 1, dataOnly.length, dataOnly[0].length); targetRange.setValues(dataOnly); } } } // 批量删除所有原工作表,仅保留合并结果表 let sheetsToDelete = workbook.getWorksheets().filter(sheet => sheet.getName() !== consolidateSheet.getName()); sheetsToDelete.forEach(sheet => sheet.delete()); }
关键说明
- 自动复用或创建"合并结果"工作表,避免重复创建
- 处理表头重复问题:默认仅保留第一个工作表的表头,若不需要此逻辑,可删除
hasHeader相关代码,直接全量写入所有数据 - 自动跳过空工作表,防止执行错误
- 最后批量删除原工作表(不能在遍历原工作表数组时直接删除,会导致遍历异常)
注意事项
- 执行前建议备份原文件,避免数据丢失
- 若需要保留原表格式,可添加
targetRange.setFormat(dataRange.getFormat())语句复制格式 - 脚本执行后原工作表会被永久删除,请确认需求后再运行
内容的提问来源于stack exchange,提问作者AmazingBand Proyect's
相关产品推荐
相关产品推荐

