You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }      
  }  
} 

冲突根源

  1. 固定范围创建表格导致列数不匹配
    convert脚本用固定范围A1:AJ2(36列)创建表格,但删除第一行后的工作表实际数据列数可能少于36列,此时表格会包含空列。后续combine脚本获取表头时,空列会被计入维度,导致目标范围和表头数组的列数不匹配,触发setValues错误。

  2. 表格索引错误与列数不一致
    combine脚本用tables[1]获取表头,但convert脚本删除了Feuil1工作表,表格列表的索引会发生变化,导致获取到的表头并非预期表格的表头。同时,如果convert处理后的多个表格列数不一致,合并时addRows会因数据列数与合并表格列数不匹配报错。

  3. 合并脚本时的时序问题
    将两个脚本合并后,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:47:19