JS-WPS 自动化办公(5)多Sheet整合
Hi uu们,是不是遇到明明同个类型的数据,导出来分好几个Sheet,要整合到一个Sheet里面才好筛选,如果sheet不多的话也无所谓,但是sheet多也是挺麻烦的,由此我们可以搞个JS小程序整合所有的Sheet。
首先先自己建一个多Sheet的表格,如下图所示:

多表格Sheet
📌明确目标
-
获取所有Sheet的名字除了汇总 -
激活对应Sheet并且选择要复制的范围 -
整合’汇总’并将数据粘贴到汇总,粘贴的时候看是否A列的对应行是否为空
✅ 第一步:获取所有 Sheet 的名字(排除“汇总”)
function getSheetNamesExceptSummary(workbook, targetSheetName = '汇总') {let sheetCount = workbook.Sheets.Count;let sheetNames = [];for (let i = 1; i <= sheetCount; i++) {let sheetName = workbook.Sheets(i).Name;//排除名字叫汇总的if (sheetName !== targetSheetName) {sheetNames.push(sheetName);}}return sheetNames;}
✅ 第二步:激活对应 Sheet 并选择要复制的范围
function copyDataFromSheet(workbook, sheetName) {workbook.Sheets(sheetName).Activate();Range("A2:X500").Select();Selection.Copy(undefined); // 仅复制值(不带格式)}
✅ 第三步:整合到一起
function 粘贴到汇总(){// 激活当前工作簿(取第一个打开的工作簿)let workbook = Application.Workbooks.Item(1);let workbookName = workbook.Name;console.log("已激活工作簿: " + workbookName); // 在控制台输出当前工作簿名称,用于确认操作对象// 获取当前工作簿中所有工作表的数量let sheetCount = workbook.Sheets.Count;// 创建一个空数组,用于存储所有工作表的名称let SheetArray = [];// 定义目标汇总表的名称,后续将跳过此表不进行复制let TargetSheetName = '汇总';// 循环遍历每一个工作表(索引从1开始,因为Excel工作表索引是1-based)for (let i = 1; i <= sheetCount; i++){// 获取第i个工作表的名称let sheetName = workbook.Sheets(i).Name;// 激活该工作表(虽然此处激活对后续无直接影响,但保留原逻辑)workbook.Sheets(sheetName).Activate();// 将当前工作表名称添加到SheetArray数组中SheetArray.push(sheetName);}// 遍历所有已收集的工作表名称for (const item of SheetArray) {// 如果当前工作表名称不是“汇总”,则进行数据复制操作if(item != TargetSheetName){// 在控制台打印当前正在处理的工作表名称(用于调试或进度跟踪)console.log(item);// 先激活“汇总”工作表,目的是为了查找A列中第一个空单元格的位置workbook.Sheets(TargetSheetName).Activate();// 声明变量QueryResult,用于记录找到的空单元格地址(如"A10")let QueryResult;// 从第1行开始向下逐行检查A列,最多检查到第199,999行(防止无限循环)for(let Query = 1; Query < 200000; Query++){// 读取A列第Query行的值(.Value2返回原始值,不带格式)QueryResult = Range("A" + Query).Value2;// 在控制台输出当前单元格的值,便于调试判断是否为空console.log("是否为空: " + QueryResult);// 如果该单元格为空(在JavaScript环境中,Excel空单元格通常返回undefined)if(QueryResult == undefined){// 将空单元格的地址(如"A5")赋值给QueryResultQueryResult = 'A' + Query;// 找到第一个空单元格后立即退出循环break;}}// 在控制台输出最终确定的粘贴起始位置console.log("空的单元格 QueryResult " + QueryResult);// 激活当前要处理的源工作表(即非“汇总”的那个表)workbook.Sheets(item).Activate();// 选中固定区域:从A2到X500(共499行,24列),作为要复制的数据范围Range("A2:X500").Select();// 执行复制操作(undefined表示使用默认剪贴板模式)Selection.Copy(undefined);// 再次激活目标“汇总”工作表,准备粘贴workbook.Sheets(TargetSheetName).Activate();// 选中之前找到的空单元格(作为粘贴的起始位置)Range(QueryResult).Select();// 执行选择性粘贴:仅粘贴数值(不带公式、格式等)// 参数说明:// xlPasteValues:只粘贴值// xlPasteSpecialOperationNone:不进行运算(如加、减等)// false:不跳过空单元格// false:不转置行列Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);}}}
🎉 验证结果

自己也试试吧,查找是否为空的单元格这个不太智能,建议用其他方式实现,在这里抛砖引玉,有啥想法就在评论区说说吧!
夜雨聆风
