Office Script脚本合并/流运行报错:行列维度不匹配问题排查
问题分析与解决
问题描述
两个单独运行正常的Excel Script脚本(convert和combine),合并到同一脚本或在Power Automate流中一起运行时出现维度不匹配错误:
- 最初报错:
Line 17: Range setValues: Le nombre de lignes ou de colonnes dans le tableau d’entrée ne correspond pas à la taille ou aux dimensions de la plage.(输入数组的行列数与范围尺寸不匹配) - 注释第17行后,第31行报错:
Line 31: Table addRows: Le nombre de lignes ou de colonnes dans le tableau d’entrée ne correspond pas à la taille ou aux dimensions de la plage.(输入数组的行列数与表格范围不匹配)
原脚本如下:
convert脚本
function main(workbook: ExcelScript.Workbook) { let worksheets = workbook.getWorksheets(); for (let i = 1; i < worksheets.length; i++) { let selectedSheet = workbook.getWorksheets()[i]; selectedSheet.getRange("1:1").delete(ExcelScript.DeleteShiftDirection.up); let newTable = workbook.addTable(selectedSheet.getRange("A1:AJ2"), true); } workbook.getWorksheet('Feuil1')?.delete(); }
combine脚本
function main(workbook: ExcelScript.Workbook) { // Delete the "Combined" worksheet, if it's present. workbook.getWorksheet('Combined')?.delete(); workbook.getWorksheet('Feuil1')?.delete(); // Create a new worksheet named "Combined" for the combined table. const newSheet = workbook.addWorksheet('Combined'); // Get the header values for the first table in the workbook. // This also saves the table list before we add the new, combined table. const tables = workbook.getTables(); const headerValues = tables[1].getHeaderRowRange().getTexts(); console.log(headerValues); // Copy the headers on a new worksheet to an equal-sized range. const targetRange = newSheet.getRange('A1').getResizedRange(headerValues.length-1, headerValues[0].length-1); //targetRange.setValues(headerValues); // Add the data from each table in the workbook to the new table. const combinedTable = newSheet.addTable(targetRange.getAddress(), true); for (let table of tables) { let dataValues = table.getRangeBetweenHeaderAndTotal().getTexts(); let rowCount = table.getRowCount(); // If the table is not empty, add its rows to the combined table. if (rowCount > 0) { combinedTable.addRows(0, dataValues); } } }
冲突根源
固定范围创建表格导致列数不匹配
convert脚本用固定范围A1:AJ2(36列)创建表格,但删除第一行后的工作表实际数据列数可能少于36列,此时表格会包含空列。后续combine脚本获取表头时,空列会被计入维度,导致目标范围和表头数组的列数不匹配,触发setValues错误。表格索引错误与列数不一致
combine脚本用tables[1]获取表头,但convert脚本删除了Feuil1工作表,表格列表的索引会发生变化,导致获取到的表头并非预期表格的表头。同时,如果convert处理后的多个表格列数不一致,合并时addRows会因数据列数与合并表格列数不匹配报错。合并脚本时的时序问题
将两个脚本合并后,convert创建表格的过程中可能生成列数不一致的表格,combine部分直接获取tables列表后,后续添加行操作会因维度不匹配失败。
修复方案
1. 修改convert脚本:动态获取数据范围创建表格
抛弃固定列数,根据实际数据区域创建表格:
function convert(workbook: ExcelScript.Workbook) { let worksheets = workbook.getWorksheets(); for (let i = 1; i < worksheets.length; i++) { let selectedSheet = worksheets[i]; selectedSheet.getRange("1:1").delete(ExcelScript.DeleteShiftDirection.up); // 动态获取已使用的单元格范围,避免固定列数 let usedRange = selectedSheet.getUsedRange(); if (usedRange) { let newTable = workbook.addTable(usedRange, true); } } workbook.getWorksheet('Feuil1')?.delete(); }
2. 修改combine脚本:统一表头列数,修正索引问题
确保所有表格列数一致,使用正确索引获取表头:
function combine(workbook: ExcelScript.Workbook) { workbook.getWorksheet('Combined')?.delete(); const newSheet = workbook.addWorksheet('Combined'); const tables = workbook.getTables(); // 检查表格列表是否为空,使用第一个有效表格的表头 if (tables.length === 0) { console.log("No tables found in workbook"); return; } // 使用第一个表格的表头(避免索引错误) const headerValues = tables[0].getHeaderRowRange().getTexts(); 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) { let dataValues = table.getRangeBetweenHeaderAndTotal().getTexts(); let rowCount = table.getRowCount(); // 检查当前表格的列数是否与合并表格一致 if (rowCount > 0 && dataValues[0].length === headerValues[0].length) { combinedTable.addRows(0, dataValues); } else if (dataValues[0].length !== headerValues[0].length) { console.log(`Skipping table ${table.getName()}: column count mismatch`); } } }
3. 合并后的完整脚本
将两个逻辑整合到同一个main函数中:
function main(workbook: ExcelScript.Workbook) { // 先执行convert逻辑 let worksheets = workbook.getWorksheets(); for (let i = 1; i < worksheets.length; i++) { let selectedSheet = worksheets[i]; selectedSheet.getRange("1:1").delete(ExcelScript.DeleteShiftDirection.up); let usedRange = selectedSheet.getUsedRange(); if (usedRange) { workbook.addTable(usedRange, true); } } workbook.getWorksheet('Feuil1')?.delete(); // 再执行combine逻辑 workbook.getWorksheet('Combined')?.delete(); const newSheet = workbook.addWorksheet('Combined'); const tables = workbook.getTables(); if (tables.length === 0) { console.log("No tables found in workbook"); return; } const headerValues = tables[0].getHeaderRowRange().getTexts(); 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) { let dataValues = table.getRangeBetweenHeaderAndTotal().getTexts(); let rowCount = table.getRowCount(); if (rowCount > 0 && dataValues[0].length === headerValues[0].length) { combinedTable.addRows(0, dataValues); } else if (dataValues[0].length !== headerValues[0].length) { console.log(`Skipping table ${table.getName()}: column count mismatch`); } } }
内容的提问来源于stack exchange,提问作者laoda
相关产品推荐
相关产品推荐

