资讯动态

用WorkBuddy生成JSA宏:自动删除WPS表格重复值与空值

发布时间:2026/9/1 19:12:41 来源:尧图企业网站定制
先问大家一个真实的工作场景你手上有一张从系统里导出的客户表里面既有重复报名的客户又有残缺不全的空值行。正常情况下的做法是打开 WPS 表格先筛选重复项再逐列定位空值接着手动删除或者补全。一次两次还能接受如果是每周都要处理的数据清洗任务纯手工操作不仅效率低而且很容易漏掉重复行。最近在折腾 WorkBuddy 的“靠嘴编程”功能时发现一个很适合办公场景的落地组合用 WorkBuddy 把自然语言需求直接生成 WPS 表格的 JSA 宏代码然后复制到 WPS 宏编辑器里运行最终完成“删除重复值和空值”的数据清洗任务。整个过程不需要手写复杂代码也不需要懂完整的 JavaScript 语法只要能把需求描述清楚WorkBuddy 就能帮你把代码搭出来。本文会围绕 WorkBuddy 与 WPS-JSA 的完整实战流程展开包含环境准备、需求描述技巧、核心宏代码逐段拆解、运行验证以及常见报错排查。无论你是经常跟 Excel/WPS 表格打交道的办公人员还是想了解“靠嘴编程”落地方式的开发者都可以按本文流程自己跑一遍。藏头实用工具与方法结合能显著提升表格数据清洗效率。1. 背景与核心概念1.1 WorkBuddy 是什么WorkBuddy 是一款以自然语言交互为核心的 AI 编程助手工具可以基于用户用中文或英文描述的需求生成代码、脚本、自动化流程片段。和传统开发方式不同的是WorkBuddy 更强调“意图到代码”的转换能力也就是网上经常说的“靠嘴编程”。在办公自动化场景中WorkBuddy 的价值不在于替代完整的企业级开发而在于快速生成针对具体任务的脚本。比如批量重命名文件。自动整理文件夹。编写数据处理脚本。生成 WPS/Excel 宏代码。辅助编写接口自动化测试脚本。对于不熟悉编程的办公人员来说WorkBuddy 相当于一个会写代码的助手对于开发者来说它又类似于一个代码片段生成器能减少重复性样板代码的编写时间。本文用到的核心能力只有一个用自然语言描述数据清洗需求让 WorkBuddy 生成 WPS-JSA 宏代码。1.2 WPS-JSA 是什么WPS-JSA全称是 WPS JavaScript Application也就是 WPS 表格中的 JavaScript 宏功能。它允许用户使用 JavaScript 语言编写宏脚本实现对表格数据的自动化操作。和传统 VBA 宏相比JSA 有几方面的特点语言基础是 JavaScript前端开发者上手更快。宏代码以.js或项目形式保存在 WPS 中。调用 WPS 表格对象模型的方式与 VBA 类似但 API 风格更接近 JavaScript 习惯。可以通过“开发工具”选项卡进入宏编辑器进行编写和运行。需要特别说明的是不同 WPS 版本对 JSA 的支持不完全一致。部分较早版本可能默认只支持 VBA不提供 JSA 编辑器入口而新版本的 WPS 个人版、专业版已经在“开发工具”中提供了 JSA 支持。实际使用前需要先确认你本机的 WPS 版本和功能权限。1.3 “靠嘴编程”的实际含义“靠嘴编程”听起来很玄其实核心就是把“人的自然语言需求”转换成“可执行的代码脚本”。整个流程可以拆成三部分需求表达用清晰、具体的语言描述要处理的数据范围和操作逻辑。代码生成AI 工具根据需求生成代码。验证执行把代码放到目标环境运行观察结果并迭代优化。“靠嘴编程”虽然降低了编码门槛但并不是说完全不需要思考。需求描述得越清楚代码生成质量就越高。比如“把表格里重复的数据删掉”就是无效描述而“删除 A2:C100 区域中所有列完全相同的重复行保留第一次出现的数据行”就是高质量描述。本文后面的实例会围绕“高质量指令描述”展开。2. 环境准备与版本说明2.1 本文环境清单先列出本文实战所用的基础环境方便对照环境项说明操作系统Windows 10 及以上Win7 需要以实际 WPS 版本支持为准WPS 版本支持 JSA 宏编辑器的 WPS 版本建议升级到较新的正式版宏编辑器入口WPS 表格 → 开发工具 → JSA 宏编辑器WorkBuddy桌面客户端或网页版能看到对话生成界面即可示例数据WPS 表格中手动构造的“客户报名表”数据区如果你的电脑上 WorkBuddy 尚未安装可以先从官方渠道下载客户端或者使用网页版入口。安装过程中如果有网络代理类设置尽量走正常联网环境不要配置非正规代理避免安全风险。2.2 确认 WPS 是否支持 JSA打开 WPS 表格在顶部菜单栏查看是否有“开发工具”选项卡。如果没有可以尝试点击“文件”菜单 →“选项” →“自定义功能区”勾选“开发工具”。检查 WPS 版本是否为较新的正式版。确认当前账户是否具备宏功能权限。如果功能区已经出现“开发工具”再点击“JSA 宏编辑器”能弹出类似代码编辑器的窗口说明当前环境支持 JSA。需要注意WPS 的 JSA 编辑器打开之后左侧会显示工程资源管理器中间是代码编辑区域。这里我们可以新建模块、编写宏代码并运行。2.3 WorkBuddy 使用前置说明WorkBuddy 本身并不直接操作 WPS 表格它的输出结果是“文本形式”的代码。也就是说WorkBuddy 生成的 JSA 宏需要你手动复制到 WPS 宏编辑器中运行。这一点要多说一句WorkBuddy 类似一个编程助手而不是表格插件。它不能替代宏编辑器也不是 WPS 的自动化插件。理解这一点之后就不会对“代码怎么跑起来”产生困惑了。3. 核心逻辑与 JSA 宏设计思路在让 WorkBuddy 生成代码之前先梳理清楚“删除重复值和空值”这个需求在表格处理中的底层逻辑。3.1 删除重复值的数据逻辑表格中的重复行通常是指“指定区域内所有列的值完全相同”的数据行。比如姓名手机号报名课程张三13800000001Python 基础李四13800000002Java 入门张三13800000001Python 基础第三行与第一行完全一致这里的“张三”就是重复数据。处理的方式是保留第一次出现的行删除之后出现的相同行。如果只根据某一列去重比如只根据“手机号”去重那么即使“姓名”和“课程”不同只要手机号相同也要视为重复。这种按列去重的逻辑在 JSA 中同样可以实现。这里要强调的是在执行删除操作前建议备份原表或先复制一份数据到新工作表。数据清洗属于破坏性操作一旦误删除很难恢复。3.2 删除空值的数据逻辑“空值”在不同场景下含义不同单元格为空白。单元格包含空格但看起来为空。单元格包含null、undefined或不可见字符。简单场景下我们只需要判断单元格的Value()是否为空、是否为null、是否为undefined再决定是否把整行视为空行删除。常见设计中如果一行中所有单元格都为空可以认为它是“空白行”直接删除。如果只有某一列为空比如“手机号”为空则根据业务规则决定是删除整行还是只填充默认值。本文的示例以“整行数据完全为空则删除该行”为主同时保留对单列空值的判断演示便于你按实际需求修改。3.3 JSA 宏的整体执行流程整个 JSA 宏可以按以下流程设计获取当前活动工作表。确定数据区域范围例如从 A1 到 C100。从最后一行向上遍历逐行判断是否为空行。删除空行。对剩余数据区域执行去重操作。弹出提示框显示删除结果。这里选择“从下往上遍历”的原因在于删除行会导致行号变化。如果从上往下遍历删除一行后后面的行会整体上移容易漏处理。而从最后一行开始向上遍历则每次都只处理当前行不受之前删除操作影响。在 WPS-JSA 中Range 对象的Delete()方法和工作表的UsedRange属性是完成这项工作的重要手段。4. 完整实战WorkBuddy 生成 JSA 宏删除重复值与空值4.1 准备测试数据在 WPS 表格中新建一个工作表命名为“客户报名表”输入以下测试数据姓名手机号报名课程张三13800000001Python 基础李四13800000002Java 入门张三13800000001Python 基础王五13800000003数据分析李四13800000002Java 入门赵六13800000004自动化办公孙七13800000005爬虫实战这个表格包含三行完全重复的数据张三、李四重复行。一行完全空白的数据第七行。一行“姓名为空、其他列为空”的数据第九行实际是姓名列空白但整行其他列也为空。需要注意第九行的 A9、B9、C9 都为空所以它在逻辑上也属于整行空行。4.2 编写高质量 WorkBuddy 指令打开 WorkBuddy 对话窗口先明确你的需求范围。下面是一段推荐的中文指令模板我在 WPS 表格中有一张“客户报名表”数据范围是 A1:C9。 第一行是标题行姓名、手机号、报名课程。 请帮我生成一段 WPS-JSA 宏代码实现以下功能 1. 从数据最后一行向上遍历删除整行单元格全为空的行 2. 在剩余数据中根据 姓名手机号报名课程 三列联合判断删除重复数据行保留第一次出现的行 3. 弹出一个消息框提示删除了多少行空数据、删除了多少行重复数据 4. 代码需要注释清楚方便我后续修改。这段指令包含几个关键信息明确工作表名称。明确数据范围。明确标题行占用情况。明确空值判断逻辑。明确去重字段。明确结果提示方式。要求注释。需求越具体生成的代码越接近可直接运行的状态。反过来如果你的指令只写“帮我删掉重复的和空的”生成的代码大概率需要你自己再调半天。WorkBuddy 生成代码后不需要立刻全盘接受。可以检查一下它是否使用了UsedRange、是否从下往上遍历、是否对标题行做了保护。如果发现没有处理标题行可以追加指令请保留第一行标题不要删除标题行。通过多轮对话不断修正代码是“靠嘴编程”的正确打开方式。4.3 WorkBuddy 生成的 JSA 宏代码示例下面是一段基于上述需求生成的 JSA 宏核心代码可以作为参考。不同 WorkBuddy 版本可能生成略有差异但整体思路是通用的。文件位置WPS 宏编辑器 → 模块 → 新建模块然后粘贴以下代码function 删除重复值和空值() { // 获取当前活动工作表 var sheet ActiveSheet; // 定义数据区域根据实际数据范围调整 var lastRow 9; var lastCol 3; var startRow 2; // 从第2行开始因为第1行是标题 // 统计删除数量 var emptyCount 0; var duplicateCount 0; // 第一步从下往上删除整行全为空的行 for (var i lastRow; i startRow; i--) { var rng sheet.Cells(i, 1).Resize(1, lastCol); var isEmptyRow true; for (var j 1; j lastCol; j) { var cellValue rng.Cells(1, j).Value(); if (cellValue ! null cellValue ! undefined String(cellValue).trim() ! ) { isEmptyRow false; break; } } if (isEmptyRow) { rng.Delete(xlUp); emptyCount; } } // 第二步从下往上删除重复行联合判断姓名、手机号、报名课程 // 先获取当前最大行号 var maxRow sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row; var seen {}; for (var i maxRow; i startRow; i--) { var name sheet.Cells(i, 1).Value(); var phone sheet.Cells(i, 2).Value(); var course sheet.Cells(i, 3).Value(); // 拼接成唯一键 var key String(name) | String(phone) | String(course); if (seen[key]) { sheet.Rows(i).Delete(); duplicateCount; } else { seen[key] true; } } // 第三步弹出提示 MsgBox(删除空行 emptyCount 行\n删除重复行 duplicateCount 行); }代码说明xlUp表示向上查找下一个非空单元格等同于xlToUp的枚举。sheet.Cells(i, 1).Resize(1, lastCol)表示从当前行第一列开始扩展为 1 行 3 列的区域。String(cellValue).trim() ! 判断单元格内容去掉首尾空格后是否为空字符串可以过滤掉纯空格单元格。seen对象用于记录出现过的主键第二次遇到相同 key 就删除当前行。MsgBox是 WPS-JSA 中常用的弹窗方法与 VBA 的 MsgBox 类似。这里需要注意sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row这段代码是用来动态获取最后一行的行号避免写死 9。第二次遍历时由于已经删除了空行实际最大行号可能与初始不同所以要重新计算一次。4.4 完整代码优化版本上面的代码可以运行但还有优化空间。实际项目中数据范围不确定标题行位置也不一定固定。我们可以把代码改成更通用一点function 删除重复值和空值_优化版() { var sheet ActiveSheet; // 动态获取最后一行和最后一列 var lastRow sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row; var lastCol sheet.Cells(1, sheet.Columns.Count).End(xlToLeft).Column; var startRow 2; // 默认第一行是标题 var emptyCount 0; var duplicateCount 0; // 第一步删除整行全为空的行 for (var i lastRow; i startRow; i--) { var isEmptyRow true; for (var j 1; j lastCol; j) { var cellValue sheet.Cells(i, j).Value(); if (cellValue ! null cellValue ! undefined String(cellValue).trim() ! ) { isEmptyRow false; break; } } if (isEmptyRow) { sheet.Rows(i).Delete(); emptyCount; } } // 第二步按指定列联合去重 var newLastRow sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row; var seen {}; for (var i newLastRow; i startRow; i--) { // 如果想按单列去重可以只读取一列的数据例如只读手机号列 var name sheet.Cells(i, 1).Value(); var phone sheet.Cells(i, 2).Value(); var course sheet.Cells(i, 3).Value(); var key String(name) | String(phone) | String(course); if (seen[key]) { sheet.Rows(i).Delete(); duplicateCount; } else { seen[key] true; } } MsgBox(删除空行 emptyCount 行删除重复行 duplicateCount 行); }这段代码相对于前一版的变化使用sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row动态获取最后行。使用sheet.Cells(1, sheet.Columns.Count).End(xlToLeft).Column动态获取最后列。删除空行和重复行之后重新计算最新最后行号。End(xlUp)和End(xlToLeft)是表格对象模型中常用的定位方法分别表示从底部向上、从右侧向左找边界。利用它们可以避免写死数据范围。4.5 运行与验证步骤4.5.1 打开宏编辑器在 WPS 表格中点击“开发工具”选项卡找到“JSA 宏编辑器”并点击。如果之前没有用过 JSA编辑器会打开一个新窗口。4.5.2 新建模块并粘贴代码在 JSA 宏编辑器的左侧工程管理器中找到当前工作簿对应的工程右键点击“模块”或“插入模块”新建一个空白模块。然后把上面“优化版”代码复制进去。同时需要把函数名改成方便识别的名字比如删除重复值和空值_优化版记得保存。4.5.3 运行宏回到宏编辑器工具栏点击“运行”按钮或者在代码中把光标放在函数内部直接点击运行当前过程。这时 WPS 表格会自动执行代码。运行完成后会弹出一个消息框显示删除的空行数量和重复行数量。4.5.4 验证结果运行后再看“客户报名表”理想状态下剩余数据应该是姓名手机号报名课程张三13800000001Python 基础李四13800000002Java 入门王五13800000003数据分析赵六13800000004自动化办公孙七13800000005爬虫实战如果表格数据与预期不符可以按第 5 节中的排查方法处理。4.6 Python 处理相同需求的对比方案有些读者可能更习惯用 Python 处理表格这里额外提供一个使用 pandas 和 openpyxl 的对比脚本方便大家理解两种方式的差异。文件路径scripts/clean_data.pyimport pandas as pd # 读取 Excel 文件 df pd.read_excel(客户报名表.xlsx, engineopenpyxl) # 记录原始行数 original_count len(df) # 删除整行全为空的行 df df.dropna(howall) # 删除重复行保留第一次出现的行 df df.drop_duplicates() # 统计删除数量 removed_count original_count - len(df) print(f共删除 {removed_count} 行) print(df)这个脚本在逻辑上与 JSA 宏一致先删除全空行再删除重复行。如果你的环境里有 Python也可以用这个方式快速验证数据清洗逻辑是否正确然后再把结论对应到 JSA 代码中。5. 常见问题与排查思路5.1 JSA 宏运行时提示“缺少对象”或“未找到成员”问题现象点击运行宏后WPS 弹出类似“对象不支持此属性或方法”的报错。常见原因当前 WPS 版本对某些 JSA API 支持不完整。使用了 VBA 的枚举名但 JSA 环境中枚举名不同。代码中引用了不存在的属性比如Rows.Count写了小写但实际对象不支持。解决思路先确认代码中xlUp在当前 WPS-JSA 版本中是否可用。某些版本需要写成xlToUp或使用数字-4162。改用sheet.UsedRange.Row sheet.UsedRange.Rows.Count - 1来获取最后一行。在报错行附近加MsgBox输出临时变量定位具体哪一行报错。5.2 去重没有生效重复行还在问题现象运行宏后重复数据没有被删除或者只删除了一部分。常见原因单元格中包含肉眼不可见的空格导致两个数据看似相同实际字符串不同。去重 key 拼接时空值变成了null或undefined字符串导致不同空值行被当成不同行。数据区域实际包含格式或公式残留Value()读取的不是预期内容。解决思路在拼接 key 之前统一对单元格值做String(value).trim()清洗。对空值单独处理比如空值统一转成空再拼接。先用MsgBox输出每一行的 key观察是否出现假差异。5.3 空行没有被删除问题现象整行全为空的行仍然保留在表格中。常见原因空格字符被当作有效内容。单元格存在返回空字符串的公式。遍历范围不包含空行所在区域。解决思路在判断空行时使用String(cellValue).trim() 作为空值判断条件。检查lastRow是否通过End(xlUp)正确获取。如果表格中最后一行的数据本身是空行End(xlUp)可能无法跳到正确位置。可以先用MsgBox输出lastRow和lastCol的值确认范围没有问题。5.4 误删了标题行问题现象运行宏后第一行标题也不见了。常见原因startRow设置为 1导致标题行也被纳入判断范围。标题行本身内容较少在某种判断逻辑下被当成空行删除。解决思路在代码中明确var startRow 2;。如果标题不在第一行根据实际位置调整startRow。删除前先备份当前工作表数据或复制一份工作表再测试。5.5 WorkBuddy 上下文用量满了怎么办问题现象长时间使用 WorkBuddy 对话窗口后提示上下文用量已满无法继续追问。常见原因单向对话窗口积累了大量历史消息达到模型上下文长度限制。解决思路新建一个对话窗口重新描述需求并把核心指令粘贴进去。在生成稳定代码后及时把关键代码复制到本地文件。不要在一个窗口里反复测试多个无关需求尽量保持对话专一。这个问题的处理思路和日常 IM 工具清空聊天记录类似属于正常使用约束不影响已生成的代码结果。5.6 错误现象与排查汇总问题现象常见原因解决思路宏无法运行JSA 环境不支持某些 API换用 UsedRange 获取数据范围重复行删除不干净单元格包含不可见空格统一 trim 后再判断空行删除后数据错乱遍历顺序不对改为从下往上遍历标题行被误删startRow 设置错误显式指定 startRow2弹窗提示删除 0 行lastRow 获取错误检查 End(xlUp) 的用法WorkBuddy 对话中断上下文达到上限新建会话并精简指令数据区域包含合并单元格合并单元格取值异常先取消合并再处理6. 最佳实践与工程建议6.1 数据清洗前必须备份不管是使用 JSA 宏还是 Python 脚本只要涉及删除行第一步永远是备份。建议在运行宏之前先右键点击工作表标签选择“移动或复制”勾选“建立副本”生成一个备份工作表。也可以在代码中先用Copy方法复制当前表。数据删除是不可逆的操作一旦误删越早发现越容易恢复。备份是成本最低的安全措施。6.2 需求描述要具体化使用 WorkBuddy 生成代码时自然语言描述的颗粒度直接决定代码质量。建议在描述中包含工作表名称。数据区域或列范围。标题行位置。空行的判定标准整行空还是某列为空。去重字段。是否保留第一次出现的行。是否弹窗提示。比如请生成 WPS-JSA 宏对 Sheet1 中 A1:D100 区域操作 第一行是标题从最后一行向上遍历 删除整行全为空的行再根据 B 列手机号去重 保留首次出现的行弹窗提示删除数量。这样一条指令已经接近完整的需求文档生成的代码大概率可以直接使用。6.3 先用小数据集验证在真实生产数据上运行宏之前应当先用少量测试数据验证逻辑。比如专门准备一份只有 5 到 10 行的小表格其中包含重复行、空行、标题行运行后确认结果正确再对完整数据执行。这样做的原因很简单小数据量便于肉眼核对一旦逻辑有误能快速发现而不会在几百行数据中找问题。6.4 避免硬编码数据范围虽然本文示例中写死了lastRow 9但实际项目中更推荐使用动态获取var lastRow sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row; var lastCol sheet.Cells(1, sheet.Columns.Count).End(xlToLeft).Column;动态获取范围的好处是当数据量每天变化时不需要手动修改代码。这也是工程化脚本的基本要求。6.5 不要过度依赖 AI 生成代码“靠嘴编程”能提高效率但不代表不需要理解代码逻辑。至少应该掌握几个基础概念如何获取单元格的值。如何遍历行。如何删除一行。如何拼接字符串作为去重 key。如何弹窗提示。当你能够看懂生成代码、判断逻辑是否符合预期时才能高效地使用类似 WorkBuddy 的工具。否则一旦代码出错排查成本反而更高。6.6 宏运行权限与安全提示JSA 宏和 VBA 宏一样属于可执行代码。运行来源不明的宏存在安全风险。在实际办公环境中应当只运行自己编写或可信来源提供的宏。运行前检查代码是否包含删除文件、修改系统设置、访问网络等危险操作。在测试环境验证通过后再用于生产数据。重要文档启用备份机制。特别提醒不要随意运行网上陌生人分享的宏代码更不要在未确认代码内容的情况下执行涉及数据库、系统配置文件或隐私数据的脚本。6.7 性能优化思路如果表格数据量很大比如几万行遍历每一行并逐个删除会导致运行较慢。JSA 中可以考虑先把符合删除条件的行号收集起来再统一删除减少 Delete 调用次数。使用更高效的批量区域操作。先在内存中构建数据数组处理完再写回工作表。例如先收集要删除的行号var rowsToDelete []; for (var i lastRow; i startRow; i--) { if (isEmptyRow) { rowsToDelete.push(i); } } for (var k 0; k rowsToDelete.length; k) { sheet.Rows(rowsToDelete[k]).Delete(); }不过批量删除时要注意行号变化影响通常推荐从后往前删除或者一次性构建多个不连续区域删除。7. 总结与后续学习方向通过一个“删除重复值和空值”的完整实例可以看出 WorkBuddy 与 WPS-JSA 的结合点很清晰WorkBuddy 负责把中文需求转换成可执行的宏代码WPS-JSA 负责在表格环境中执行这些代码。整个过程中最关键的并不是 AI 有多强大而是你能否把需求描述得足够精确以及能否在生成代码后做基本校验。本文的核心要点可以归纳为以下几点删除空值时建议从下往上遍历避免行号变化造成漏删。删除重复值时要明确去重字段并注意空格和空值造成的假差异。使用End(xlUp)和End(xlToLeft)动态获取数据范围避免硬编码。WorkBuddy 生成代码后最好在小数据集上测试一次。宏运行前必须备份数据。接下来可以继续学习的方向包括WPS-JSA 中UsedRange、Range、Cells等对象的更多用法。使用 JSA 实现多表合并、数据拆分、条件格式等办公自动化任务。WorkBuddy 生成 Python 脚本用 pandas 做更复杂的数据清洗。了解 WPS 表格与外部数据源数据库、接口之间如何通过宏或脚本打通。最后建议你动手试一下先建一张包含重复值和空值的测试表再用 WorkBuddy 生成宏代码运行后核对结果。只有亲手跑通一次才能理解“靠嘴编程”的边界在哪里也才能把这类工具真正用到日常工作中。数据清洗看起来是一个小功能但把它自动化之后省下来的时间会比你想象的更多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价