使用Excel Script循环工作表提取表格数据至Power Automate
解决方案
你的脚本存在几个关键问题:仅指定了单个工作表、未实际提取表格行数据、没有收集并返回合并后的数组。以下是修改后的完整脚本,可实现遍历所有工作表、提取唯一表格行数据并合并返回的需求:
function main(workbook: ExcelScript.Workbook): object[] { // 初始化主数组存储所有合并数据 let masterData: object[] = []; // 获取工作簿内所有工作表 const allWorksheets = workbook.getWorksheets(); // 遍历每个工作表 allWorksheets.forEach(worksheet => { const tables = worksheet.getTables(); // 检查当前工作表是否存在表格(按需求每个表只有一个) if (tables.length > 0) { const targetTable = tables[0]; // 获取表格的所有单元格值(第一行为表头) const tableValues = targetTable.getRange().getValues(); const headers = tableValues[0] as string[]; // 从第二行开始处理数据行,转换为键值对对象(适配Power Automate处理) for (let rowIndex = 1; rowIndex < tableValues.length; rowIndex++) { const row = tableValues[rowIndex]; const rowObj: Record<string, any> = {}; headers.forEach((header, colIndex) => { rowObj[header] = row[colIndex]; }); masterData.push(rowObj); } } }); // 返回合并后的数组给Power Automate return masterData; }
关键修改说明
- 遍历所有工作表:使用
workbook.getWorksheets()获取工作簿内全部工作表,而非固定指定Sheet1 - 数据收集逻辑:初始化
masterData数组,手动将每个表格的行数据推入数组(原脚本的forEach返回操作无效,无法收集数据) - 提取行数据并格式化:通过
getRange().getValues()获取表格的原始值,将表头作为对象键、行数据作为值,转换为对象数组(这种格式在Power Automate中更易进行后续操作) - 容错处理:添加表格存在性判断,避免无表格的工作表导致报错
- 明确返回值:函数指定返回
object[]类型,确保Power Automate能正确接收合并后的数组
如果需要返回纯二维数组(不含键值对,仅行列数据),可以使用以下简化版本:
function main(workbook: ExcelScript.Workbook): any[][] { let masterData: any[][] = []; let hasAddedHeaders = false; workbook.getWorksheets().forEach(worksheet => { const tables = worksheet.getTables(); if (tables.length > 0) { const tableValues = tables[0].getRange().getValues(); // 仅保留一次表头,后续只添加数据行 if (!hasAddedHeaders) { masterData.push(tableValues[0]); hasAddedHeaders = true; masterData.push(...tableValues.slice(1)); } else { masterData.push(...tableValues.slice(1)); } } }); return masterData; }
内容的提问来源于stack exchange,提问作者stackyMike
相关产品推荐
相关产品推荐

