使用Excel Office Script从多表提取指定列合并为单表的问题
解决方法
以下是修正后可直接运行的完整代码:
function main(workbook: ExcelScript.Workbook) { let sheets = workbook.getWorksheets(); for (let sheet of sheets) { // 跳过目标合并表避免处理报错 if (sheet.getName() === "Combined") continue; if (sheet.getTables().length > 0) { sheet.getTables()[0].convertToRange(); } const usedRange = sheet.getRange('A1').getUsedRange(); if (usedRange) { sheet.addTable(usedRange.getAddress(), true); } } workbook.getWorksheet('Combined')?.delete(); const newSheet = workbook.addWorksheet('Combined'); const tables = workbook.getTables(); // 目标列名数组,后续直接复用 const targetHeaders = ['Column1', 'Column6', 'Column8', 'Column9','Column11', 'Column16', 'Column18', 'Column19']; const headerValues = [targetHeaders]; const targetRange = newSheet.getRange('A1').getResizedRange(headerValues.length - 1, headerValues[0].length - 1); targetRange.setValues(headerValues); const combinedTable = newSheet.addTable(targetRange.getAddress(), true); for (let table of tables) { // 跳过合并表自身避免重复读取数据 if (table.getWorksheet().getName() === "Combined") continue; const rowCount = table.getRowCount(); if (rowCount <= 0) continue; // 按预设的目标列名依次提取对应列数据 const columnData = targetHeaders.map(header => { const col = table.getColumnByName(header); // 兼容当前表无指定列的场景,自动填充空值 return col ? col.getRangeBetweenHeaderAndTotal().getTexts().map(row => row[0]) : new Array(rowCount).fill(""); }); // 把按列存储的数据转置为按行存储的二维数组,匹配addRows方法的参数要求 const dataValues = []; for (let i = 0; i < rowCount; i++) { const currentRow = columnData.map(colVals => colVals[i]); dataValues.push(currentRow); } combinedTable.addRows(-1, dataValues); } }
核心调整说明
- 新增了工作表、表格的过滤逻辑,避免处理新建的Combined表时触发异常
- 增加了空使用区域、空表的兼容判断,无数据的工作表不会导致脚本报错
- 提取列的逻辑直接复用你预设的目标列名数组,遍历依次获取每列数据,同时兼容部分表格缺少指定列的场景,自动填充空值
- 完成多列数据提取后,将列结构的数组转置为行结构的二维数组,符合表格添加行的参数格式要求
内容的提问来源于stack exchange,提问作者George Chitechi
相关产品推荐
相关产品推荐

