
我们先把话说在前面如果你是第一次看到“WorkBuddy”和“WPS-JSA”这两个词第一反应大概率是——这又是一个 AI 写代码的玩具或者 WPS 里某个被吹上天的“黑科技”功能。但当你真正在办公室打开一个 5000 行的 Excel 表格发现里面混着几百条重复数据、几十个空单元格而你的同事还在手动一行一行删的时候你就明白这件事不是“玩具”而是实打实的生产力。这篇文章要讲的核心就一句话用 WorkBuddy 通过自然语言生成 WPS-JSA 宏代码然后让 WPS 自己去删除数据中的重复值和空值。它既不是纯 WPS 技巧教程也不是纯 JSA 编程课而是一条“靠嘴编程”的完整落地路径。我会给你一个可以直接照抄的工作流需求描述、AI 生成代码、粘贴到 JS 宏编辑器、运行、验证结果、处理边界情况。整个过程不需要你精通 JavaScript但需要你理解 WPS-JSA 的几个关键概念否则出错了你连问题出在哪儿都不知道。这篇文章适合四类读者第一类日常被 Excel/WPS 表格数据清洗折磨的办公人员尤其是经常处理第三方导出数据的运营、行政、财务岗位第二类想入门 WPS-JSA 宏编程但不想先啃完整本 JavaScript 语法书的新手第三类已经在用 VBA 或 JSA 写宏但想看看 AI 能不能把写代码这件事再提速的老手第四类企业里的办公自动化推广者。读完这篇文章你能得到一个可以直接用的“数据清洗小工具”更重要的是你能掌握一套“用 AI 驱动 WPS 宏开发”的方法论——这个方法可以复用到其他任何表格自动化场景。1. 为什么 WPS 用户也需要编程能力很多 WPS 用户听到“编程”两个字就下意识后退觉得这是程序员的事与自己无关。但如果你仔细算一笔账就会发现这个观念正在让你付出巨大的时间成本。假设你每个月要从系统里导出一份客户名单或订单明细里面经常出现重复的客户编号、空白的备注列、半空的行。手动处理一次可能需要 20 分钟一个月 3 次就是一个小时。如果这份表格有几十个 sheet 或者上千行时间还要翻倍。这一年下来你一个人在这件毫无技术含量的事情上就花掉了一天多时间。更可怕的是手动删除重复值容易出现误删——你看着 Excel 里的“删除重复值”弹窗根本不知道它保留的是哪一行又删掉了哪一行。很多人不知道的是WPS 表格早就内置了完整的宏编程能力早期叫 VBAVisual Basic for Applications从 WPS 2016 之后的版本开始逐步支持 JSAJavaScript for Application。JSA 本质上是让你用 JavaScript 语法去操控 WPS 表格的对象模型比如操作工作表、单元格区域、数据排序、数据筛选。但普通用户的真实困境不是“不想学”而是“学习成本太高”。要真正用 JSA 解决自己的工作问题你需要理解至少这些概念对象Object、方法Method、属性Property、Range 区域、循环语句、条件判断。这些东西对程序员来说是常识但对一个每天要做报表的行政专员来说是非常抽象的。WorkBuddy 这样的 AI 编程助手改变的不是“是否要学编程”而是“学习编程的起点已经变了”。过去你要先花一周记住语法才能写出第一个能跑的宏现在你只需要描述清楚自己的需求AI 把代码写好你负责理解它、粘贴它、运行它。你不需要从零开始你需要的是具备“看得懂代码大概在干什么”和“知道在哪运行代码”的能力。这两个要求比过去低得多。2. WPS-JSA 到底是什么先弄懂这几个概念再动手2.1 JSA 是 WPS 的 JavaScript 宏平台JSA全称 JavaScript for Application是 WPS 官方推出的宏编程接口语法上基于 JavaScript。如果你之前听过 WPS VBA那么可以简单把 JSA 理解为“WPS 的新一代宏语言”VBA 用的是 Basic 语法JSA 用的是 JavaScript 语法。从 WPS 2019 开始个人版也陆续加入了 JSA 宏的支持在 WPS 的“开发工具”选项卡中可以看到“JS 宏”的入口。JSA 和 VBA 最大的不同在于语言基础。VBA 的语法非常古老学习曲线陡峭JSA 的编写体验更接近现代编程语言。JSA 操作表格的基本方式是在对象模型里调用方法和属性。比如要获取当前活动工作表可以使用ActiveSheet要获取一个单元格区域可以用Range(A1:B10)要删除整行可以用.EntireRow.Delete()。2.2 对象、方法和属性的基础认知在 JSA 里表格被抽象成一组相互嵌套的对象Application代表整个 WPS 应用程序。Workbook代表一个工作簿也就是一个.xlsx或.et文件。Worksheet代表工作簿里的一个工作表。Range代表一个单元格区域可以是单个单元格也可以是连续或不连续的多个单元格。你要告诉 WPS “做什么”本质就是“调用某个对象的方法”。比如// 获取当前工作簿的第一个工作表 var ws ActiveWorkbook.Worksheets.Item(1); // 选中 A1 单元格 ws.Range(A1).Select(); // 把 A1 的值赋为 你好 ws.Range(A1).Value2 你好;这三行代码分别做了三件不同的事。你看其实编程没有想象中那么神秘就是你告诉程序“我要操作哪张表、哪个位置、做什么事”。2.3 JSA 和 VBA 的对比对比维度VBAJSA语言基础Basic 语法代码风格老式JavaScript 语法更现代入门难度对新手不太友好有 JS 基础的话上手很快WPS 兼容性部分版本需要额外授权新版 WPS 原生支持入口为“JS 宏”扩展能力主要面向 Office 对象模型除了表格操作还能调用 WPS 对象模型后续能做的事情更多社区资源老资源多正在快速增长官方文档逐步完善如果你完全没接触过编程我建议你直接学 JSA不需要再去看 VBA。VBA 的很多老代码确实还能用但未来的方向明显在 JSA 这边。WorkBuddy 这类 AI 工具默认也更倾向于生成 JSA 代码因为这些代码结构清晰、逻辑易读、容易调试。3. WorkBuddy 是一个什么样的工具定位与核心使用流程3.1 它的定位不是“代码补全器”而是“自然语言到代码的转换器”主流的 AI 编程助手比如 Cursor、GitHub Copilot主要服务于专业程序员它们的核心场景是补全代码、生成函数、解释报错。WorkBuddy 的定位不太一样它更强调“用自然语言描述任务AI 直接生成你能用的代码或流程”。在你这个场景里你不需要懂 JSA 的每一个 API你只需要说出“删除选中区域的重复值保留第一个同时删除空行”WorkBuddy 就能生成对应的 JSA 代码。如果你跑错了它还会帮你分析错误信息并给出修正版本。3.2 使用 WorkBuddy 的基本流程从现有信息来看WorkBuddy 的使用流程大致如下安装客户端或登录网页端可能需要通过安装包或邀请码开通权限。在主界面选择要使用的“Skill”或直接进入对话框。输入自然语言任务建议描述尽量具体比如“对 WPS 表格的当前工作表删除 A 列到 E 列中的重复值保留第一次出现的行然后删除所有完全空白的行”。让 AI 生成代码检查代码是否符合预期然后复制。在 WPS 中打开“开发工具”-“JS 宏”新建一个模块粘贴代码保存并运行。这五个步骤就是整个“靠嘴编程”的核心闭环。听起来是不是很简单但真正决定这件事能做成还是做砸的往往在第 3 步——自然语言描述是否足够精确。AI 不是神仙它无法读心。如果你只说“把重复的删掉”它不知道你要删除的是整行还是只删除某个单元格也不知道以哪一列作为判断重复的依据。所以后面我会专门讲怎么写出高精度的提示词。3.3 WorkBuddy、WPS VBA 和 JSA 的关系你可能在搜索时看到“wps vba 7.1”这样的词那是 WPS 早期或第三方封装的 VBA 版本。如果你已经安装了 WPS 并且能看到“JS 宏”或“VBA”入口那么处理重复值时两种方式都能做。WorkBuddy 不依赖 VBA它生成的是可以直接在 WPS 的 JSA 宏环境中运行的代码。说得再直白一点WorkBuddy 是“帮你写代码的 AI 助手”WPS-JSA 是“运行代码的运行环境”VBA 则是“另一个老代码运行环境”。我们用 JSA 而不是 VBA是因为 JSA 更现代、更容易被 AI 理解、在新版 WPS 中支持更好。4. 删除重复值和空值的完整实现从提示词到 JSA 代码这一部分直接进入正题。我们不讨论抽象概念直接给出一个能跑的方案。4.1 第一步把需求说清楚一个好的 AI 提示词至少要包含五个要素目标环境告诉 AI 这是 WPS 表格要生成 JSA 宏代码。操作对象明确是哪张表、哪些列、作用范围。业务规则判断重复的依据是哪些列空值是指空单元格还是整行为空。保留策略重复时保留第几条记录。边界条件比如是否跳过表头、是否清除格式还是整行删除。示例提示词如下你是 WPS 表格 JSA 宏代码专家。请为 WPS 表格编写一段 JSA 宏代码。 需求 1. 对当前活动工作表的 A 列到 E 列做数据处理。 2. 第一行是表头不要删除。 3. 从第2行开始以 A 列为唯一标识判断重复如果 A 列的值相同保留第一次出现的行删除后续重复行。 4. 删除所有整行完全空白的行即 A 到 E 列都是空值。 5. 如果有某个单元格为空但不影响整行则保留该行不做处理。 6. 运行前弹出提示让用户确认是否开始处理。 请输出可直接运行的 JSA 代码并加上必要的中文注释。这段提示词里的每一个“约束”都是为了防止 AI 生成一个不够精准的版本。你把业务规则说得越细生成出来的代码就越接近你的预期。4.2 第二步把 AI 生成的代码粘贴到正确的位置打开 WPS 表格按下快捷键Alt F8或者点击菜单栏的“开发工具”-“JS 宏”进入宏编辑器。如果你的 WPS 没有看到“开发工具”选项卡可以在“文件”-“选项”-“功能区”中把“开发工具”勾选出来。在宏编辑器中点击“新建”按钮给宏起一个名字例如DeleteDupAndBlank然后把 AI 生成的代码粘贴进去保存。这里要特别提醒你WPS 的 JS 宏和 VBA 宏虽然都在“开发工具”里但它们是两个不同的入口。如果你点击的是“VBA”那你看到的是 Basic 语言的编辑器粘贴 JavaScript 代码会报错。一定要选择“JS 宏”入口。4.3 第三步一段可运行的 JSA 示例代码为了保证你在 AI 生成结果不尽人意时也有代码可用我先给出一段完整的、可以直接粘贴运行的 JSA 代码。这段代码实现了“以 A 列为依据删除重复行同时删除完全空白行”的功能并且跳过了表头。// 文件WPS 表格 JS 宏 // 功能删除重复行以 A 列为判断依据并删除完全空白的行 // 注意请先备份数据宏运行后无法用 CtrlZ 完全恢复 function DeleteDupAndBlank() { // 1. 获取当前活动工作表 var ws ActiveSheet; // 2. 获取数据总行数从第1行到最大行 var lastRow ws.Cells(ws.Rows.Count, 1).End(-4162).Row; // -4162 等效于 xlUp var lastCol 5; // 这里写死为 E 列共5列 if (lastRow 2) { MsgBox(数据不足无需处理。); return; } // 3. 给用户一个确认提示 var confirm MsgBox(即将开始删除重复行基于A列和完全空白行是否继续, 1); if (confirm ! 1) { return; } // 4. 从最后一行往前遍历删除完全空白的行 // 为什么要从后往前避免删除行之后行号变化导致漏判 for (var i lastRow; i 2; i--) { var isRowEmpty true; for (var j 1; j lastCol; j) { var cellValue ws.Cells(i, j).Value2; if (cellValue ! null cellValue ! String(cellValue).trim() ! ) { isRowEmpty false; break; } } if (isRowEmpty) { ws.Rows(i).Delete(); } } // 5. 重新计算最后一行删除空行后行数可能变化 lastRow ws.Cells(ws.Rows.Count, 1).End(-4162).Row; // 6. 再用一个对象记录“已经出现过的A列值”从第2行开始遍历 var seen {}; for (var k lastRow; k 2; k--) { var key String(ws.Cells(k, 1).Value2); if (key null || key ) { continue; // 如果A列本身为空跳过让空行删除逻辑处理 } if (seen[key]) { ws.Rows(k).Delete(); } else { seen[key] true; } } MsgBox(处理完成已删除重复值和空白行。); }4.4 代码逻辑拆解这段代码的流程可以拆成四步第一步获取数据范围。ws.Cells(ws.Rows.Count, 1).End(-4162).Row这段代码是 JS 宏里常见的“获取最后一行的技巧”。它的含义是从第一列的最下面一个单元格第1048576行开始向上找到第一个有数据的单元格返回它的行号。这里的-4162是xlUp在 JSA 对象模型中的数字表示。第二步删除完全空白行。这里用一个嵌套循环外层循环从最后一行往前遍历内层循环检测每一行的前五列是否都为空。如果整行都为空就删除该行。为什么从后往前遍历这是处理表格行删除问题的经典做法。如果你从前往后删除删掉第 5 行之后原本的第 6 行就变成了新的第 5 行你的循环索引会乱掉导致漏删或误删。第三步删除重复行。用一个对象seen来记录已经出现过的 A 列值。同样从后往前遍历遇到 A 列值已经出现过的行就删除该行。因为你从后往前删所以第一次出现的行会被保留后面的重复行会被删除——这是“保留第一条”的简单实现方式。第四步弹出提示窗口表达处理完成。这段代码是通用版本你可以根据实际需求修改lastCol的值比如你的数据只有三列就把 5 改成 3如果你要以 B 列而不是 A 列作为去重依据就把所有Cells(k, 1)换成Cells(k, 2)。5. 更复杂的场景按多列判断重复、只清除内容不删行在实际工作中需求往往不会这么简单。下面扩展两个常见场景。5.1 场景一按多列判断重复假设你的表格里“姓名 部门 日期”三列同时相同才算重复。那么你就不能只看 A 列而是要把多个列拼成一个组合键function DeleteDupByMultiCols() { var ws ActiveSheet; var lastRow ws.Cells(ws.Rows.Count, 1).End(-4162).Row; var seen {}; for (var i lastRow; i 2; i--) { var name String(ws.Cells(i, 1).Value2); var dept String(ws.Cells(i, 2).Value2); var dateVal String(ws.Cells(i, 3).Value2); var key name | dept | dateVal; if (key ||) { continue; // 跳过三列都为空的行 } if (seen[key]) { ws.Rows(i).Delete(); } else { seen[key] true; } } MsgBox(多列去重完成。); }这里用|作为分隔符拼接三列的值是为了避免“列1的值为A列2的值为B”和“列1的值为AB列2的值为空”这两种情况被合并成同一个 key。5.2 场景二只清除空单元格不删除整行有时候你并不是想删除整行只是想找到某列中的空单元格填上默认值或清空格式。比如 C 列是备注列里面有些单元格是空的你想让 WPS 自动填入“无”。function FillBlankCells() { var ws ActiveSheet; var lastRow ws.Cells(ws.Rows.Count, 3).End(-4162).Row; for (var i 2; i lastRow; i) { var cell ws.Cells(i, 3); if (cell.Value2 null || String(cell.Value2).trim() ) { cell.Value2 无; } } MsgBox(空值填充完成。); }5.3 场景三删除某列包含空值的所有行这个需求跟前面的“整行空白”不一样。假设你的表格中“订单号”列B列不能让空值存在如果 B 列是空的该行数据就是无效数据要删除整行。那么可以写成function DeleteRowsWithBlankInColumnB() { var ws ActiveSheet; var lastRow ws.Cells(ws.Rows.Count, 2).End(-4162).Row; for (var i lastRow; i 2; i--) { var val ws.Cells(i, 2).Value2; if (val null || String(val).trim() ) { ws.Rows(i).Delete(); } } MsgBox(已删除 B 列为空的行。); }这三个扩展场景的核心逻辑都差不多区别只在“判断条件”和“操作动作”。你可以借助 WorkBuddy 生成这些变体代码也可以自己照着上面的模板改。6. 在 WPS 中运行 JSA 宏的完整步骤6.1 打开 JS 宏编辑器第一步打开 WPS 表格打开你要处理的数据文件。第二步点击菜单栏“开发工具”选项卡。如果你看不到“开发工具”请点击左上角“文件”-“选项”-“自定义功能区”在右侧列表勾选“开发工具”。第三步点击“JS 宏”按钮进入宏编辑界面。6.2 新建宏并粘贴代码在宏编辑器中点击“新建”按钮给宏设置一个英文名称比如DeleteDupAndBlank确认后会生成一个空白的函数框架function DeleteDupAndBlank() { }把前面第 4 节中的代码整体复制到两个花括号之间然后保存。按Alt F8或者在菜单中点击“运行宏”找到你刚才创建的宏名点击运行即可。6.3 运行前的数据备份任何涉及删除行的宏我建议你先复制一份原始文件到临时目录再运行。宏一旦执行删除的行不会进入回收站CtrlZ 撤销也不一定完全可靠。备份是避险的第一原则。7. 运行结果与验证方法宏运行后你需要验证三件事第一数据行数是否符合预期。如果原始数据有 5000 行去重后剩下 4200 行那么被删除的行数应该等于 800 行左右。你可以通过状态栏的计数来核对。第二A 列是否还存在重复值。选中 A 列使用“条件格式”-“突出显示重复值”看是否还有重复项被标记。如果宏删除干净这里不会出现任何高亮。第三空白行是否被删干净。按住Ctrl End看工作表的最后一行是否为数据的最后一行如果跳到了几百行之后说明表格里可能还有格式残留但没有数据的行。这时候你可以再额外删除这些行或者接受它们——只要它们在数据区域之外不影响数据统计即可。如果宏运行失败首先看宏编辑器下方的“即时”窗口或错误提示。最常见的错误是“对象不支持此属性或方法”。这通常是因为你用了 VBA 风格的 API 但运行在 JSA 环境。比如 VBA 里的Range(A65536).End(xlUp).Row在 JSA 里要写成数字-4162或者使用ActiveSheet.Range(A1).CurrentRegion这样的替代方案。8. 常见问题与排查思路问题现象可能原因排查方式解决方案WPS 中看不到“开发工具”选项卡功能区未开启点击“文件”-“选项”-“自定义功能区”勾选“开发工具”点击“JS 宏”没有反应WPS 版本过旧不支持 JSA检查 WPS 版本更新到新版升级到支持 JSA 的版本代码粘贴后保存报错“语法错误”代码中有中文字符标点或括号不匹配检查中文引号、中文分号将引号和分号改为英文半角运行宏后提示“找不到宏”宏名称与运行窗口中的名称不一致到宏编辑器中确认函数名选择正确的宏名运行宏运行时提示“对象不支持”VBA 与 JSA API 混用查看具体出错行将 VBA 风格方法改为 JSA 风格重复值没有被完全删除判断重复的列与业务要求不一致检查代码里使用的列序号修改Cells(i, 1)中的列号数据行被误删空白行判断条件不严谨检查空值判断逻辑增加trim()处理不可见空格宏运行后有数据丢失没有备份原文件检查原始文件下次运行前先备份删除行后序号混乱从前往后遍历删除导致检查循环方向改为从后往前遍历WPS 是个人版无法运行 VBA只有 JSA 宏或需要特定版本查看开发工具入口使用 JSA 宏替代 VBA 宏以上每一条都是实际操作中容易踩到的坑尤其是“中文标点”和“VBA/JSA API 混用”这两个问题几乎是新手必踩。9. 最佳实践与工程建议怎么把“AI 生成宏”变成稳定工具9.1 提示词要像写需求文档而不是像聊天很多人用 AI 写代码不成功问题不在 AI而在于需求描述太模糊。你换位思考一下如果有个实习生坐在你旁边你只会说“把这个表的重复数据弄一下”他能听懂吗大概率不能。所以你给 AI 的提示词也要包含足够的上下文。记住一个公式运行环境 操作对象 判断规则 保留规则 边界条件。五个要素齐全AI 很难生成跑偏的代码。9.2 同一段宏不要反复粘贴到不同文件而是建一个“个人宏工作簿”如果你经常需要做数据清洗我建议你研究一下 WPS 的“个人宏工作簿”对应 Excel 里的 Personal.xlsb 概念或者干脆把常用的宏代码集中保存在一个模板文件里。每次打开新数据文件后运行这些宏即可不需要每次重新新建宏。这样可以避免重复劳动也减少粘贴代码时引入错误。9.3 宏运行前一定要做三件事备份、备份、备份任何自动化批量操作都有出错概率。你的代码写得再完美也无法覆盖所有脏数据的情况。比如某个单元格里看似空值实际上是一个不可见的空格字符你以为某列是日期格式但里面混入了文本。这些数据异常在宏运行前很难发现。所以不要嫌麻烦在运行宏前先另存一份文件加个“_备份”后缀。9.4 建议在宏里加入日志和计数器虽然我们写的 JSA 宏只是简单操作表格但在生产环境中一个愿意打印处理结果的宏远比“静默完成”的宏更可靠。你可以在删除循环里增加一个变量记录一共删除了多少行最后用MsgBox弹出结果。这样你就知道数据变动是否符合预期。9.5 用 WorkBuddy 时不要只让它写代码还要让它解释代码AI 生成代码后你可以追问一句“请逐行解释这段代码的作用”。这不仅是学习 JSA 的好机会还能帮你排查潜在风险。如果 AI 生成的代码里包含了Rows.Delete()这种危险操作你至少要清楚地知道它删除的是哪些行而不是闭眼运行。10. WorkBuddy 与 JSA 组合的边界在哪里什么时候不该用 AI 写宏这篇文章讲的是“用 WorkBuddy 生成 WPS-JSA 宏”但我还是要诚实地说一句不是所有事情都适合用 AI 写宏也不是所有表格问题都需要走宏编程这条路。如果数据量很小只有几十行你用 WPS 自带的数据工具——比如“数据”选项卡里的“删除重复项”、“筛选”功能——就可以完成根本不需要写宏。如果数据量巨大达到几十万行JSA 宏在这种数据量下运行效率可能不高因为它在单元格级遍历时性能有限。这时候用 Python 的 pandas 库、或者更专业的数据处理平台会更好。WorkBuddy 加 JSA 的最佳使用区间是什么是“中等数据量、重复性高、规则明确”的日常办公数据清洗任务。2000 行到 5 万行之间规则简单明确重复频率高这类任务用宏处理是性价比最高的。数据量再少就手动数据量再大就该考虑更专业的数据工程工具。这就像你不会用卡车去运一瓶水但也不会用手推车去运一吨面粉——工具要匹配任务规模。另外一个不该用宏的场景是数据中包含公式、合并单元格、图片或复杂格式。JSA 操作这些对象时容易出错而且删除行会导致公式引用范围错乱。如果你的表格有大量合并单元格先把合并取消再进行去重去空操作。11. 总结与后续学习方向这篇文章不是让你变成 JavaScript 程序员的而是让你拥有一种新的解决问题的方式遇到重复繁杂的表格操作先想到能不能通过 AI 生成一个宏来解决。我们完整走通了一遍“用 WorkBuddy 生成 WPS-JSA 宏并删除重复值和空值”的流程核心步骤只有四步描述需求、生成代码、粘贴到 JS 宏编辑器、运行验证。在代码层面我们覆盖了三个典型场景以单列去重并删除空白行、多列组合判断重复、指定列空值删除行。在工程层面我们聊了备份、提示词技巧、宏命名、从后往前遍历、API 差异等关键点。这些都是实际项目中一定会遇到的问题。如果你想继续深入建议按以下顺序学习第一学习 JSA 的基本对象模型重点理解 Range、Cells、Rows、ActiveSheet 这几个核心对象。第二学习 JavaScript 的基础语法尤其是循环和条件判断。有了这些储备AI 生成的代码你不仅能看懂还能自己改。第三学习 WPS 的常用 API 和工具函数如End(-4162)查找数据边界、CurrentRegion获取当前区域、Sort排序方法等。第四把 WorkBuddy 用于更复杂的任务比如多表合并、批量生成图表、自动生成周报。停留在“粘贴复制”这一步你的自动化能力是脆弱的换个表格结构你可能就不会改了。但如果你能在此基础上理解对象模型和循环思想你就有了“调试任何 AI 生成代码”的能力。这句话才是“靠嘴编程”背后真正需要修炼的内功。