JS-WPS 自动化办公(5)多Sheet整合

Hi uu们,是不是遇到明明同个类型的数据,导出来分好几个Sheet,要整合到一个Sheet里面才好筛选,如果sheet不多的话也无所谓,但是sheet多也是挺麻烦的,由此我们可以搞个JS小程序整合所有的Sheet。

首先先自己建一个多Sheet的表格,如下图所示:

多表格Sheet

📌明确目标

  1. 获取所有Sheet的名字除了汇总
  2. 激活对应Sheet并且选择要复制的范围
  3. 整合'汇总'并将数据粘贴到汇总,粘贴的时候看是否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")赋值给QueryResult
                    QueryResult = '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);
            
        }
          
    }
     
}

🎉 验证结果

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

相关推荐
缓慢更新42 分钟前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
超级架构师1 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
陈随易1 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员
叼烟扛炮2 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
风骏时光牛马2 小时前
AI稳定性治理体系构建与疑难问题深度分析
前端
LMT流氓兔2 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真2 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放3 小时前
Python基础语法练习题(75)
开发语言·python·学习
IT_陈寒3 小时前
JavaScript的this坑人实录,这次我真的记下来了
前端·人工智能·后端
starzy19903 小时前
Scala循环与判断:一切皆表达式的控制流
开发语言·人工智能·scala