联网写代码,离线来运行,借人大腿搓麻绳?——用WPS灵犀编写WPS表格JSA宏代码,不要VBA

Lv.3 优质创作者
2026年10月末的一天,我正对着WPS表格做数据透视表,小白偷偷跑了过来:"哥呀,弟弟刚找了个女朋友,在别的单位干统计,天天加班做报表,人都熬干了。你可得帮我。"
"前几天不是教你用WPS灵犀写M语言函数代码吗?回去教教她,就有时间好好谈恋爱了。"
"哥,她那老板太抠了——旧电脑是WIN7系统、十多年前4代CPU,WPS还是我给装的个人版。关键是单位规定上OA的电脑不能联外网、不能用AI、也不能用QUERY!我出主意让她偷偷联手机热点装插件,她说电脑有监控系统,一联就自动关机,还得遭HR'追杀'。怎么办呀?"
小白平时工作认真、对我也尊重,我决定放大招了。我放下鼠标,慢悠悠地说:"行啊。不过咱得说清楚:离线电脑搞自动化,别用VBA,那玩意儿快成老古董了,咱用JSA——JavaScript宏,跟写网页似的,上手快。"
"JSA?听着挺高大上,具体咋弄呢?"
"核心思路就两步走:第一步,用你手头能联网的电脑打开WPS灵犀,把需求用大白话告诉它,让它生成JSA宏代码;第二步,把代码粘进宏编辑器,另存成.xlsm文件拷给她,她那边直接打开就能用,啥都不用装。"
小白学电视里的古人拱了拱手:"哥哥,小弟愚钝,请好好教我!"
"得了,别整虚的。来,哥演示一遍。
"我打开"客户经理销售利润表.xlsx",另存为启用宏的.xlsm,然后打开WPS灵犀,在对话框里上传工作表表头字段(可用SHIFT+ENTER换行),完整输入需求:
依据上面的表格示例,请用WPS表格的JSA宏(JavaScript语法,不是VBA)写一个宏代码:约100行数据。实现功能:D列计算利润=B列-C列,E列计算客户经理提成=D列×8%,保留2位小数;要求:关键步骤加中文注释;整体try/catch,出错alert提示;生成新的工作表名"提成"保存在当前打开的工作簿中;运行环境是WPS个人版、完全离线,禁止任何网络调用。
小白凑过来:"哥,你这需求写得跟下命令似的,连'禁止网络调用'都交代上了?"
"对喽,这就是跟AI打交道的窍门:交代得越细,它写得越靠谱。表格结构、要几列、保留几位小数、报错怎么办、什么环境下跑,一条条说明白,它就不会瞎猜。尤其是这个场景,得多嘴一句'完全离线运行',省得它生成个要联网调接口的代码,白忙活。"
不一会儿,灵犀就把整段JSA宏代码吐了出来,还带中文注释,跟写网页的JavaScript一个模子。我把代码复制下来:点菜单『工具→开发工具→WPS宏编辑器』,不新建VBA模块,在左边工程栏右键插入一个"JSA模块",把代码原样贴进去,点保存:
/**
* 提成计算宏(WPS表格 JSA / JavaScript 语法,非VBA)
* 运行环境:WPS个人版,完全离线,无任何网络调用
*/
function 计算提成() {
try {
var wb = Application.Workbooks.Item(1); // 当前工作簿
var ws = wb.ActiveSheet; // 活动工作表(含示例数据)
var usedRows = ws.UsedRange.Rows.Count; // 已用区域行数(含表头)
if (usedRows < 2) {
alert("当前表没有数据行,请检查。");
return;
}
// 删除已存在的同名工作表,避免重名报错
try {
Application.DisplayAlerts = false;
wb.Worksheets.Item("提成").Delete();
Application.DisplayAlerts = true;
} catch (e) { /* "提成"表不存在时忽略 */ }
// 新建工作表"提成",放在最后
var newWs = wb.Worksheets.Add(null, wb.Worksheets.Item(wb.Worksheets.Count));
newWs.Name = "提成";
var heads = ["姓名", "销售额(元)", "成本(元)", "利润(元)", "提成"];
for (var c = 1; c <= 5; c++) newWs.Cells.Item(1, c).Value2 = heads[c - 1];
var RATE = 0.08; // 提成比例:8%
// 从第2行起逐行计算
for (var i = 2; i <= usedRows; i++) {
var name = ws.Cells.Item(i, 1).Value2;
var sales = ws.Cells.Item(i, 2).Value2;
var cost = ws.Cells.Item(i, 3).Value2;
// 跳过姓名和销售额都为空的行
if ((name === null || name === undefined || name === "") &&
(sales === null || sales === undefined || sales === "")) continue;
// 利润 = 销售额 - 成本(空值按0处理)
var s = (sales === null || sales === undefined) ? 0 : Number(sales);
var profit = s - ((cost === null || cost === undefined) ? 0 : Number(cost));
// 提成 = 利润 × 8%,四舍五入保留2位小数
var commission = Math.round(profit * RATE * 100) / 100;
newWs.Cells.Item(i, 1).Value2 = name;
newWs.Cells.Item(i, 2).Value2 = s;
newWs.Cells.Item(i, 4).Value2 = profit;
newWs.Cells.Item(i, 5).Value2 = commission;
}
// 格式:D、E列保留2位小数,表头加粗,列宽自适应
newWs.Range("D2:E" + usedRows).NumberFormat = "0.00";
newWs.Range("A1:E1").Font.Bold = true;
newWs.Columns.AutoFit();
alert("计算完成!共处理 " + (usedRows - 1) + " 行,结果已写入工作表【提成】。");
} catch (err) {
alert("宏运行出错:" + err.message + "(错误行号:" + (err.line || "未知") + ")");
}
}"最后一步,见证奇迹。"我把光标放进"计算提成"函数里,点了"运行"(或按F5)。屏幕上"叮"地弹出:"计算完成!共处理6行数据,结果已写入工作表'提成'。"
小白眼睛亮了:"这么快!可代码是在咱这台联网电脑跑的,她那台老古董咋用?"
"这就是今天最妙的地方。"我把文件另存为.xlsm(WPS自家.et格式也行),"JSA宏就住在工作簿文件里,代码跟着文件走(也可导出为.js文件,别处同结构的表格再导入使用)。拷U盘或微信传给她都行。她那台离线机只要有WPS——哪怕是最普通的个人免费版——打开文件按F5,宏就在本地跑起来,全程不碰网络。"
"等等哥,"小白举手,"宏文件打开会有安全警告,她那机器不会直接给拦了?"
"问得好!第一次打开.xlsm,顶部有条黄色安全警告,点'启用宏'就行。要是宏功能被锁死,就在WPS里搜'宏安全性',把安全级别调到中或添加受信任位置,都在本地设置里,不用联网。"
离线分发,一张表看明白
环节 | 联网的电脑(你) | 离线的电脑(她) |
写代码 | 用WPS灵犀对话生成JSA宏 | 不需要 |
调试 | 粘进宏编辑器,F5跑通 | 不需要 |
交付 | 另存为.xlsm或.et,U盘/内网传过去 | 打开文件,点"启用宏" |
使用 | 不需要 | 打开即用,本地运行,零联网 |
小白掰着手指头:"联网机负责'研发',离线机只管'运行',中间靠一个.xlsm当快递包——这不就是借人大腿搓麻绳嘛!网在人家AI身上,活儿干在咱自己的离线机上。"
"可以啊小白,都会抢答了。再送你三个进阶小贴士:
🔔 一是代码不满意就让灵犀改。比如在对话里说'帮我把提成比例改成变量放单元格B1里',它就给你改一版,不用自己动手。
二是先拿十行假数据试跑。跑通一百行不如先跑通十行,别一上来就上真数据,万一算错了还得回头对数。
三是try/catch别嫌啰嗦。真出了错,弹窗会告诉你错在第几步,比对着空表格抓瞎强多了——这就是需求里写'出错alert提示'的原因。"
记个三步口诀
适用场景:离线电脑要用自动化、单位禁AI禁外网、机器老旧跑不动大插件——只要那边WPS能打开文件,这套"借网研发、离线运行"的路子就通。前提就一条:离线机的WPS得允许运行宏,第一次打开记得点"启用宏"。
以后需求再复杂,比如跨工作簿取数、定时自动跑,可以让灵犀接着往深了写,JSA的能力比今天演示的这段大得多。
小白心满意足,把客户经理销售利润表.xlsm拷进U盘,哼着小曲儿走了:"哥,这周末约会我去教她,回头请你喝奶茶——加冰的!"
我冲他背影喊了一嗓子:"先把咱这篇存好,教人的时候照着讲,省得代码忘了还得回来问哥!"
Lv.3 优质创作者
Lv.3 优质创作者
Lv.2 潜力创作者
Lv.3 优质创作者
Lv.3 优质创作者
Lv.3 优质创作者
Lv.3 优质创作者
Lv.4 核心创作者
Lv.3 优质创作者