
各位做办公自动化、数据处理的朋友应该都有类似的经历表格里几千行数据既有重复记录又有空单元格每次手动清理都要按住Ctrl反复筛选、删除、核对费时费力不说还容易误删。最近在尝试用 WorkBuddy 配合 WPS 的 JS 宏JSA来做“靠嘴编程”发现原本需要写半天代码的活现在只需要把需求说清楚AI 就能生成可运行的 JSA 脚本直接删重复值、清空值效率提升非常明显。这篇文章就围绕“WorkBuddy 实现 WPS-JSA 靠嘴编程”这个主题完整拆解一个真实的工作实例如何用自然语言描述需求让 WorkBuddy 生成 WPS-JSA 代码最终一键删除表格中的重复值和空值。文章会覆盖环境准备、JSA 核心语法、完整代码、运行验证、踩坑记录和工程建议。即使你完全没写过 JSA 宏只要跟着步骤操作也能在自己的 WPS 表格里跑起来。1. 背景什么是 WorkBuddy、WPS-JSA 和“靠嘴编程”1.1 WorkBuddy 是什么WorkBuddy 是一款面向办公场景的 AI 编程与自动化助手。它和常见的聊天式 AI 不同重点在于“把自然语言指令转换为可执行的办公自动化代码”支持网页、脚本编写、接口自动化、工作台搭建等场景。对于经常处理 Excel、WPS 表格的用户来说WorkBuddy 最大的价值是你不需要懂复杂的对象模型和 API 记忆只要描述清楚“我要对表格做什么”它就能生成对应的 JS 代码在 WPS 中称为 JSA即 JavaScript for Application。和 CodeBuddy 这类面向软件开发者的 AI 编程工具相比WorkBuddy 更偏向办公和业务场景生成的代码以表格处理、文档操作、重复性任务自动化为主。简单理解CodeBuddy 是给程序员写业务系统用的WorkBuddy 是给需要处理数据的人做办公自动化用的。1.2 WPS-JSA 是什么WPS 表格除了支持传统的 VBA 宏之外还提供了基于 JavaScript 的宏能力官方称为 JSAJavaScript for Application。JSA 的语法遵循 ECMAScript 标准同时暴露了一套操作文档、工作表、单元格的对象模型。JSA 和 VBA 的定位相似都可以通过宏录制、代码编写来实现自动化但语法差异很大。VBA 使用Sub、End Sub、Dim等关键字而 JSA 使用function、let、const、for...of等 JavaScript 语法。对于熟悉前端开发的人来说JSA 的上手难度比 VBA 低很多。JSA 的代码入口是在 WPS 表格中打开“开发工具 - JS宏”或者在“工具 - 开发工具 - 打开 JS 宏编辑器”。你可以在 JS 宏编辑器中新建模块粘贴代码然后通过“运行”按钮或按钮控件触发。1.3 “靠嘴编程”的含义“靠嘴编程”并不是一个新概念本质上是 AI 辅助编程的一种口语化表达。传统编程方式是你构思逻辑手写代码调试运行。AI 辅助编程方式是你用自然语言描述需求和边界条件AI 生成代码你负责验证和修正。在 WPS-JSA 场景中“靠嘴编程”尤其适用原因有三JSA 的对象模型和 API 虽然不算复杂但普通用户记不住Range、Worksheet、RemoveDuplicates这些对象和方法名。表格处理需求往往是一次性的比如“清理这份数据的重复值”为一个一次性需求去学完整 JSA 语法成本太高。WorkBuddy 这类工具能够结合上下文理解表格语义生成的代码往往比网上零散粘贴的片段更贴近实际表格结构。所以“靠嘴编程”在本文中的实际含义是描述需求 - AI 生成 JSA 代码 - 粘贴运行 - 得到结果。1.4 本文的实战目标本文的最终目标数据清洗任务有两个删除指定区域中的重复行重复单元格。删除或清空指定区域中的空值单元格。为了兼顾两类读者的需要本文既给出最直接的“一键解决”代码也给出拆解后的分步实现方便你按场景选择性使用。2. 环境准备与版本说明2.1 需要准备的工具工具说明WPS Office需要支持 JS 宏的版本建议使用较新的 WPS 2019 或 WPS Office 最新版WorkBuddyAI 编程助手用于根据自然语言生成 JSA 代码示例数据一份包含重复值和空值的测试表格版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。如果你的 WPS 版本较旧JS 宏入口可能不在“开发工具”下可以检查菜单栏“工具 - 开发工具”。2.2 如何确认 JSA 环境可用在 WPS 表格中按Alt F11或者点击“开发工具 - JS宏”如果能打开 JS 宏编辑器说明当前 WPS 支持 JSA。打开 WPS 表格 - 菜单栏找到“开发工具” - 点击“JS宏”或按 AltF11 - 看到 JS 宏编辑器即表示环境可用如果找不到开发工具需要先到 WPS 的“文件 - 选项 - 自定义功能区”中勾选“开发工具”选项卡。2.3 准备一份实验数据为了方便测试建议先在表格中准备如下数据姓名部门销售额张三销售一部1000李四销售二部空张三销售一部1000空销售三部500王五销售一部空李四销售二部空这份数据中包含了两类典型问题第 1 行和第 3 行完全重复张三销售一部1000。多个单元格为空值李四的销售额、第一列的姓氏、王五的销售额。后面的代码会分别处理这两类问题。3. WorkBuddy 生成 JSA 代码的核心方法3.1 WorkBuddy 的提示词设计要想让 WorkBuddy 生成准确的 JSA 代码提示词非常关键。很多人失败的原因是描述太模糊例如“帮我删掉重复的”AI 不知道你是删整行、删列、去重后保留哪一条也不知道操作范围是当前工作表还是指定区域。一个清晰的提示词应该包含以下要素使用场景在 WPS 表格中使用 JSA 宏。操作对象当前工作表、指定工作表还是选中区域。操作目标删除重复行、删除空单元格还是空行。边界条件从第几行开始、保留表头与否、空值如何处理。下面是一个可以直接复制给 WorkBuddy 的提示词示例请用 WPS JSA 编写一个宏要求如下 1. 在当前工作表中查找 A1:D100 范围内的重复行删除重复项保留第一次出现的行表头为第 1 行不参与去重。 2. 在同一范围内将所有空单元格填充为默认文本“待补录”。 3. 删除“待补录”所在的整行数据即清空数据中的空值行。 4. 最后在控制台输出删除了多少行重复数据和多少行空值数据。这个提示词的定义比较严格实际执行时如果你不希望对空值行做整行删除只希望把空单元格标记出来就删掉第 3 条需求即可。提示词越明确生成代码的可用性越高。3.2 WorkBuddy 生成代码后的检查思路AI 生成的代码不能直接“无脑复制”到生产环境尤其涉及删除数据时必须做检查和理解。你需要关注以下几点操作范围是否正确是否只操作你指定的区域而不是整张工作表。是否保留表头很多去重宏会把表头一起删掉导致标题丢失。空值删除方式是删除单元格整体导致数据上移错位还是删除整行更安全还是只清空内容。是否包含可逆备份如果没有备份机制建议运行前先手工复制一份数据。4. 实战用 WorkBuddy 生成 JSA 代码并清理重复值与空值下面进入正题从需求描述到代码运行全流程。4.1 明确需求并编写提示词本文要实现的需求可以简单概括为三句话第一去掉“姓名、部门、销售额”三列中的重复项。第二去掉完全为空的行。第三把残留的空单元格标记为“无”方便后续统计。注意“空值”有两种处理逻辑。严格说“删除数据里的空值”可以指把空值单元格所在的行删除。把空值单元格直接删掉右侧数据左移。把空值单元格填充为某个默认值。这三者结果完全不同。本文以“删除重复行 删除空行 补录剩余空单元格”为例。4.2 方法一使用 JSA 的 RemoveDuplicates 方法WPS JSA 支持Range.RemoveDuplicates方法这是删除重复值最直接的方式。它的语法和 Excel VBA 里的RemoveDuplicates类似通过Columns参数指定按哪几列判断重复。下面是一段基于 WorkBuddy 生成的、可以直接运行的 JSA 代码// 文件路径WPS 表格 - 开发工具 - JS宏 - 模块1 function 删除重复值与空值() { // 获取当前活动工作表 let sheet ActiveSheet; // 定义数据范围假设数据在 A1:C100 // 请根据实际数据量修改范围 let dataRange sheet.Range(A1:C100); // 记录处理前的总行数 let totalRows dataRange.Rows.Count; // 调用 RemoveDuplicates 删除重复项 // 参数1: 按第1列到第3列判断重复 // 参数2: 第一行是表头所以 Header 传 xlYes值为 1 dataRange.RemoveDuplicates( [1, 2, 3], // 参与去重的列索引从 1 开始 1 // xlYes 1表示首行为表头 ); // 计算删除重复项后剩余行数 let afterDedupRows sheet.Range(A1:C100).Rows.Count; let removedDupCount totalRows - afterDedupRows; // 再次定位数据范围去重后数据行数会减少 // 这里使用 CurrentRegion 获取当前区域 let newRange sheet.Range(A1).CurrentRegion; // 查找空单元格并填充为“无” for (let r 1; r newRange.Rows.Count; r) { for (let c 1; c newRange.Columns.Count; c) { if (newRange.Cells(r, c).Value() null || newRange.Cells(r, c).Value() ) { newRange.Cells(r, c).Value2 无; } } } // 删除整行为空的行 // 注意这里需要从最后一行向前删除避免索引错乱 let lastRow newRange.Rows.Count; let removedEmptyRows 0; for (let r lastRow; r 1; r--) { let isEmptyRow true; for (let c 1; c newRange.Columns.Count; c) { let cellValue newRange.Cells(r, c).Value2; if (cellValue ! null cellValue ! cellValue ! 无) { isEmptyRow false; break; } } if (isEmptyRow) { newRange.Rows(r).Delete(); removedEmptyRows; } } // 在立即窗口中输出处理结果 console.log(删除重复行数: removedDupCount); console.log(删除空值行数: removedEmptyRows); }代码说明ActiveSheet表示当前活动工作表。RemoveDuplicates([1,2,3], 1)中的第一个参数是数组表示按照第 1、2、3 列来判断是否重复第二个参数1表示第一行是表头。使用CurrentRegion可以在去重后重新圈定数据区域不需要写死行数。查找空值使用的是Value()方法读取单元格值时空单元格返回null或。删除行时使用从后往前循环的方式这是表格循环删除的经典写法可以避免删除前面的行导致后续索引错位。如果你只是想删除重复值不需要删除空行可以直接把后面的空行处理代码删掉。代码中的console.log在 WPS JS 宏编辑器的“立即窗口”中可以看到输出。4.3 方法二使用嵌套循环手动标记并删除RemoveDuplicates虽然方便但在某些 WPS 版本中如果区域包含合并单元格、区域大小不规则可能会报错。这时候可以用手动循环的方式实现。思路如下从最后一行开始向上循环。用一个对象记录已经出现过的“行内容指纹”。如果当前行的内容指纹已经出现过则删除该行。如果当前行的所有单元格都为空则删除该行。如果当前行只有部分单元格为空则填充为“无”。代码如下// 文件路径WPS 表格 - 开发工具 - JS宏 - 模块1 function 手工模式删除重复值空值() { let sheet ActiveSheet; // 假设数据在第1行表头数据从第2行开始 let lastRow sheet.Range(A1048576).End(xlUp).Row; let lastCol sheet.Range(A1).CurrentRegion.Columns.Count; // 用于去重的对象 let seen {}; // 从最后一行往上处理 for (let r lastRow; r 2; r--) { let isEmptyRow true; let rowKey ; // 拼接当前行所有单元格的内容作为唯一标识 for (let c 1; c lastCol; c) { let cellVal sheet.Cells(r, c).Value2; if (cellVal ! null cellVal ! ) { isEmptyRow false; } rowKey String(cellVal) |; } // 情况1整行为空直接删除 if (isEmptyRow) { sheet.Rows(r).Delete(); continue; } // 情况2重复行删除 if (seen[rowKey]) { sheet.Rows(r).Delete(); continue; } // 记录第一次出现的行 seen[rowKey] true; // 情况3部分单元格为空填充为“无” for (let c 1; c lastCol; c) { let cellVal sheet.Cells(r, c).Value2; if (cellVal null || cellVal ) { sheet.Cells(r, c).Value2 无; } } } console.log(处理完成当前数据区域 sheet.Range(A1).CurrentRegion.Address()); }代码解析sheet.Range(A1048576).End(xlUp).Row的作用是快速定位最后一行的行号。A1048576是 Excel 和 WPS 最大行数End(xlUp)相当于从最后一行向上找第一个非空单元格。rowKey把一行中所有单元格的值拼接成字符串作为该行的“指纹”。只要三列内容完全一样指纹就一样会被判定为重复行。这里没有区分“重复行”和“空值行”数量但如果需要你可以加两个计数器分开统计。这种做法的好处是不依赖CurrentRegion的智能识别即使数据区域中间有空行、空列也不会打乱判断逻辑。缺点是当数据量非常大例如几万行、十几列时字符串拼接会占用一定内存性能不如RemoveDuplicates。4.4 完整运行流程演示下面是完整的运行步骤你可以按顺序操作。步骤一准备数据在 WPS 表格的 Sheet1 中录入测试数据。注意第 1 行是表头测试数据至少包含一组完全重复的行和几个空单元格。步骤二打开 JS 宏编辑器点击“开发工具 - JS宏”在打开的 JS 宏编辑器中左侧是工程资源管理器右上是代码编辑区。步骤三新建模块并粘贴代码在 JS 宏编辑器中右键点击工程 - 插入 - 模块然后粘贴上面任意一份代码。// 模块名称Module1 // 这里粘贴你的 JSA 代码步骤四运行宏点击工具栏上的“运行”按钮或者在代码编辑器中按F5运行当前函数。步骤五查看运行结果运行完成后回到 WPS 表格界面检查数据区域是否符合预期重复行被删除只保留第一次出现的数据。完全为空的整行被删除。剩余单元格中如果有空值则被填充为“无”。如果使用console.log打印了信息可以在 JS 宏编辑器的“立即窗口”中看到输出。4.5 预期结果使用前面准备的测试数据经过上述代码处理后最终结果应该类似如下姓名部门销售额张三销售一部1000李四销售二部无无销售三部500王五销售一部无可以看到张三的重复记录被删除。李四的销售额空缺被填充为“无”。李四原本姓名列非空、但销售额为空因此没有被整行删除。如果存在“姓名、部门、销售额全部为空”的行则会被整行删除。5. 进阶让 WorkBuddy 处理更多复杂场景5.1 按指定列去重有时你不想按所有列判断重复只想按“姓名”列去重。这种场景在客户表、成员表中很常见。给 WorkBuddy 的提示词可以这样写请用 WPS JSA 写一个宏 1. 数据在 A1:E1000第1行是表头。 2. 根据 B 列姓名去重重复的只保留第一个。 3. 删除重复行后把 D 列和 E 列的空单元格填充为 0。生成的代码核心部分如下function 按姓名去重() { let sheet ActiveSheet; let dataRange sheet.Range(A1:E1000); // 只按第2列姓名去重 dataRange.RemoveDuplicates([2], 1); let newRange sheet.Range(A1).CurrentRegion; for (let r 2; r newRange.Rows.Count; r) { for (let c 4; c 5; c) { if (newRange.Cells(r, c).Value2 null || newRange.Cells(r, c).Value2 ) { newRange.Cells(r, c).Value2 0; } } } }RemoveDuplicates的第一个参数数组只写[2]表示只有第 2 列的值完全一致时才认为两行是重复的。5.2 删除整行空值但保留局部空单元格如果你的需求是“删除整行都为空的记录”同时不想填充“无”那可以去掉填充逻辑只保留空行删除逻辑。function 仅删除空行() { let sheet ActiveSheet; let lastRow sheet.Range(A1048576).End(xlUp).Row; let lastCol sheet.Range(A1).CurrentRegion.Columns.Count; for (let r lastRow; r 1; r--) { let isEmptyRow true; for (let c 1; c lastCol; c) { if (sheet.Cells(r, c).Value2 ! null sheet.Cells(r, c).Value2 ! ) { isEmptyRow false; break; } } if (isEmptyRow) { sheet.Rows(r).Delete(); } } }这段代码简单直接适合数据中只有“整行空值”需要清理的场景。5.3 删除特定列的空值单元格并上移如果你真的想删除“某一列中的空单元格”并且让下方的非空单元格上移那么建议慎重使用。因为这种操作会导致整列数据错位破坏一行数据的完整性。比如A 列第 3 行是空值直接删除 A3 单元格并上移会导致 A 列第 3 行变成原来的 A4 内容而 B 列第 3 行还是原来的 B3 内容行与行之间的对应关系就乱了。除非你有特殊需求比如只处理单列独立数据否则不建议这样做。如果非要实现代码类似function 删除单列空单元格() { let sheet ActiveSheet; let lastRow sheet.Range(A1048576).End(xlUp).Row; for (let r lastRow; r 1; r--) { if (sheet.Cells(r, 1).Value2 null || sheet.Cells(r, 1).Value2 ) { sheet.Cells(r, 1).Delete(xlUp); } } }这段代码会把 A 列的空单元格删除下方数据上移。但还是那句话实际业务中要尽量避免这种“破坏行对应关系”的操作。6. 常见问题与排查思路6.1RemoveDuplicates方法不存在问题现象常见原因解决思路运行时报“对象不支持此属性或方法”WPS 版本过旧或 JSA 对象模型不完全兼容RemoveDuplicates改用“手工模式”循环去重或升级 WPS 版本去重后表头被删除第二个参数传成了xlNo值为 0表头存在时必须传1xlYes去重范围太小未覆盖所有数据写死了Range(A1:C100)实际数据超过 100 行使用CurrentRegion动态获取区域空值判断不生效空单元格在 JSA 中可能返回null也可能返回空字符串判断条件需同时包含 null和 6.2 运行宏时报语法错误JS 宏编辑器中每行代码末尾大多需要分号但不是强制要求更常见的问题是中英文符号混用。在输入代码时注意{}、()、;、都必须是英文半角符号。如果从网页复制代码偶尔会混入不可见字符可以先把代码粘贴到纯文本编辑器中再复制到 JS 宏编辑器。6.3 运行后数据被删错了这是最严重的问题可能原因有两个没有指定具体工作表宏运行在了错误的工作表上。去重范围判断错误删掉了不该删的数据。建议在代码开头通过名称指定工作表而不是使用ActiveSheetlet sheet Sheets.Item(Sheet1);如果要处理的工作表名称是“数据清单”就改成let sheet Sheets.Item(数据清单);6.4 空值单元格没有被识别在 JSA 中空单元格的返回值可能是null也可能是空字符串还有可能是 0如果单元格格式是数字。稳妥的判断方式是转换为字符串后再判断let cellVal sheet.Cells(r, c).Value2; if (cellVal null || String(cellVal).trim() ) { // 处理空值 }这样可以兼容“空字符串”“只有空格”的情况但不会把数字 0 误判为空值。6.5 宏运行太慢如果数据有几万行、几十列嵌套循环处理空值会比较慢。优化思路是先一次性把区域的值读入数组在内存中处理最后一次性写回工作表。function 数组模式快速清理() { let sheet ActiveSheet; let dataRange sheet.Range(A1).CurrentRegion; // 将区域数据一次性读入二维数组 let data dataRange.Value2; let rowCount data.length; let colCount data[0].length; for (let r 0; r rowCount; r) { for (let c 0; c colCount; c) { if (data[r][c] null || String(data[r][c]).trim() ) { data[r][c] 无; } } } // 将数组写回工作表 dataRange.Value2 data; }这里要注意从 JSA 的Value2取出的二维数组通常是按“行-列”索引的但不同版本可能返回null而不是空数组需要先console.log(data)确认结构。7. 数据清洗的最佳实践与工程建议7.1 操作前必须备份删除数据是不可逆操作。即使代码逻辑再正确也可能因为表格环境差异导致误删。最稳妥的做法是在运行宏之前把工作表复制一份// 复制当前工作表并命名为“数据备份” ActiveSheet.Copy(); // 复制到新工作表 ActiveSheet.Name 数据备份- Date.now();或者直接在 WPS 界面中右键工作表标签 - 移动或复制 - 勾选“建立副本”。7.2 先在测试数据上验证建议先准备一份几十行的测试数据把宏在测试文件上跑通再放到真实数据上运行。尤其是第一次使用 WorkBuddy 生成的代码不要直接应用到生产数据因为 AI 生成的代码不可能 100% 符合你的表格结构。7.3 规范命名和注释JSA 宏的名称最好用中文或英文完整描述函数用途例如删除重复行并按姓名去重、清空A列空格。注释写明操作范围、判断规则、最后修改日期方便三个月后回来看还能看懂。7.4 记录处理日志在代码中尽量输出日志方便查错console.log(开始处理数据范围: sheet.Range(A1).CurrentRegion.Address()); console.log(删除重复行: removedDupCount); console.log(删除空值行: removedEmptyRows);WPS 的 JS 宏编辑器“立即窗口”会显示这些日志。如果宏由按钮触发执行建议增加MsgBox弹窗提示处理结果避免用户重复点击。7.5 安全边界与权限意识如果这段 JSA 代码不是你自己写的而是从网上下载或由 AI 生成的运行前务必通读代码尤其关注是否访问了非本工作表的其他文件。是否包含ActiveWorkbook.Save、FileSystemObject等敏感操作。是否有循环删除的隐藏逻辑可能影响整个工作表。涉及生产数据、共享表格时建议在隔离环境、副本文件上先验证获得明确授权后再执行。不要轻易直接运行不理解的宏。7.6 针对不同 WPS 版本的适配WPS 个人版、专业版、企业版对 JS 宏的支持程度不完全一致。个人版在较新版本中可以通过“开发工具 - JS宏”进入但部分老版本可能不开放。如果你的电脑上找不到 JS 宏入口建议先升级 WPS 到最新版或者到 WPS 官网下载支持宏的版本。另外JSA 对象模型在不同版本之间可能有细微差异例如Range.RemoveDuplicates的参数、CurrentRegion的返回范围、Value2对空单元格的返回值。遇到兼容性问题时优先使用最基础的对象模型Cells、Rows、Range、Delete这些是兼容性最好的。8. 更多实战场景WorkBuddy 还能做什么除了删除重复值和空值WorkBuddy 结合 WPS-JSA 还可以完成很多办公自动化任务。这里列几个高频场景方便你举一反三。8.1 批量拆分工作表需求把一张总表中的数据按“部门”列拆分成多个工作表。提示词建议请用 WPS JSA 编写宏将当前工作表按 C 列“部门”字段拆分每个部门生成一个新工作表新工作表名称为部门名称并把表头复制过去。8.2 批量重命名 Sheets需求给当前工作簿的所有工作表名称加上“2025-”前缀。提示词建议请用 WPS JSA 编写宏遍历当前工作簿的所有工作表在每个工作表名称前加上“2025-”前缀如果名称已经包含前缀则跳过。8.3 数据对比与筛选需求比较两个工作表中“订单号”列找出只存在于工作表 A 而不存在于工作表 B 的订单。提示词建议请用 WPS JSA 编写宏工作表 Sheet1 和 Sheet2 的 A 列都是订单号找出 Sheet1 中有而 Sheet2 中没有的订单号输出到 Sheet3。8.4 定时自动统计需求每次打开工作簿时自动刷新某个单元格的日期和汇总值。提示词建议请用 WPS JSA 编写宏在 Workbook_Open 事件中自动将 Sheet1 的 A1 单元格写入当前日期并统计 B 列数字之和写入 C1。掌握“需求描述 生成代码 检查运行 备份验证”这套流程后你能处理的办公场景会越来越广。9. 总结与下一步学习建议本文从一个实际数据清洗需求出发完整演示了如何借助 WorkBuddy 生成 WPS-JSA 代码实现删除重复值、清理空值。核心收获有几点“靠嘴编程”依赖清晰的需求描述告诉 AI 处理范围、处理逻辑、表头情况、空值策略它才能生成接近可用的代码。RemoveDuplicates是 JSA 中去重最高效的方法但要注意表头参数和区域范围。空值处理有三种语义填充、删除整行、删除单元格上移你要根据业务选择。删除类操作必须备份最好在测试副本上先跑通。循环删除行时从后往前遍历这是表格脚本的通用经验。接下来你可以继续学习JSA 事件模型如何在工作簿打开、保存、切换时自动执行宏。JSA 与外部文件交互读取文本文件、生成 CSV 报表、调用 Web API。WorkBuddy 和接口自动化把表格里的数据自动提交到业务系统。更复杂的数据清洗模糊匹配、去空格、格式统一、数据透视表自动化。工具只是加速器真正可靠的是你对数据操作逻辑的理解。建议拿到 WorkBuddy 生成的代码后不要急着运行先逐行读懂它在做什么再放到测试文件中验证。这样既能保证数据安全也能在一次次实践中真正掌握 WPS-JSA。如果这篇文章对你的工作有帮助可以收藏备用。下次遇到重复值、空值、表格自动化之类的需求不妨打开 WorkBuddy用自然语言把需求说清楚剩下的交给代码去跑。