如何使用Office Script和Power Automate按客户经理拆分Excel文件
基于Office Script + Power Automate 按客户经理拆分销售Excel方案
整体逻辑:先通过Office Script完成门店与客户经理的匹配、销售数据分组,再用Power Automate循环生成每个客户经理的专属Excel文件,全程不需要本地打开文件,可配置为自动运行。
1. 预部署Office Script
打开任意存储在企业OneDrive/SharePoint的Excel文件,切换到「自动」选项卡,选择「新建脚本」,依次创建以下两个脚本并保存到组织脚本库:
脚本1:数据匹配分组(命名为分组销售数据)
功能:接收两份源数据,自动匹配门店对应的客户经理,输出按客户经理分组的销售数据集,自动保留原表表头。
function main(workbook: ExcelScript.Workbook, salesData: (string | number)[][], managerStoreMap: string[][]) { // 构建门店到客户经理的映射字典,自动跳过表头、处理首尾空格 const storeMatch = new Map<string, string>(); for (let i = 1; i < managerStoreMap.length; i++) { const manager = managerStoreMap[i][0]?.trim(); const store = managerStoreMap[i][1]?.trim(); if (manager && store) storeMatch.set(store, manager); } // 按客户经理分组销售数据 const tableHeader = salesData[0]; const groupedData = new Map<string, (string | number)[][]>(); for (let i = 1; i < salesData.length; i++) { const currentStore = salesData[i][0]?.toString().trim(); const belongManager = storeMatch.get(currentStore); if (!belongManager) continue; // 无匹配客户经理的行默认跳过,可按需修改逻辑 if (!groupedData.has(belongManager)) groupedData.set(belongManager, [tableHeader]); groupedData.get(belongManager).push(salesData[i]); } // 返回Power Automate可直接解析的结构化结果 return Array.from(groupedData.entries()).map(([managerName, rows]) => ({ managerName, salesRows: rows })); }
脚本2:单文件数据写入(命名为写入专属销售数据)
功能:在空白Excel中写入对应客户经理的销售数据,自动完成基础格式调整。
function main(workbook: ExcelScript.Workbook, managerName: string, salesRows: (string | number)[][]) { const sheet = workbook.getActiveWorksheet(); sheet.setName(`${managerName}销售数据`); // 从A1开始写入全量数据 const dataRange = sheet.getRange("A1").getResizedRange(salesRows.length - 1, salesRows[0].length - 1); dataRange.setValues(salesRows); // 基础格式:表头加粗、自动适配列宽 dataRange.getFormat().autofitColumns(); sheet.getRange("A1:Z1").getFormat().getFont().setBold(true); }
2. Power Automate流搭建步骤
- 新建云端流,触发方式按需选择,手动触发、定时触发、新文件上传触发都支持。
- 添加2个「Excel Online (Business) - 列出表中存在的行」动作,分别定位到两个源文件:
- 第一个动作选择销售数据主文件(文件1),选中存储销售数据的工作表和对应表,获取全量销售数据。
- 第二个动作选择门店-客户经理映射文件(文件2),选中对应工作表和表,获取全量映射关系。
- 添加「Excel Online (Business) - 运行脚本」动作,选择刚才保存的
分组销售数据脚本,参数salesData传入销售主文件的行值,managerStoreMap传入映射文件的行值。该步骤运行后会直接输出按客户经理分组完成的结构化数据。 - 添加「应用到每一个」循环控件,循环输入源选择上一步脚本输出的分组结果数组,在循环内完成以下操作:
- 先创建新文件:可以提前准备一个仅含空白工作表的xlsx模板存在指定文件夹,用「复制文件」动作复制模板生成新文件,新文件命名为
@{items('应用到每一个')?['managerName']}_专属销售数据.xlsx,存储位置选拆分后文件的目标文件夹。 - 新文件创建完成后,再加一个「运行脚本」动作,定位到刚生成的新xlsx文件,选择
写入专属销售数据脚本,参数managerName传入当前循环项的经理名称,salesRows传入当前循环项的销售行数据。
- 先创建新文件:可以提前准备一个仅含空白工作表的xlsx模板存在指定文件夹,用「复制文件」动作复制模板生成新文件,新文件命名为
- (可选)循环结束后添加邮件发送/Teams通知动作,将对应文件作为附件推送给对应客户经理,或者通知管理员拆分完成。
注意事项
- 两个源文件内的门店名称尽量保持命名统一,脚本已自动处理字段首尾空格,可覆盖大部分格式不一致导致的匹配失败问题。
- 单份销售主文件数据量超过10万行时,建议在分组脚本中添加分批处理逻辑,避免Power Automate运行超时。
- 所有涉及的Excel文件必须存储在企业版OneDrive或SharePoint文档库,个人版OneDrive不支持Office Script跨文件调用。
- 如果不需要自动调整格式,可以删掉写入脚本里的格式设置代码,能大幅提升大文件的写入速度。
内容的提问来源于stack exchange,提问作者Hans Baltussen
相关产品推荐
相关产品推荐

