WPS JSA 宏编程(JS):1.初识 您所在的位置:网站首页 wps的ppt制作入门教程 WPS JSA 宏编程(JS):1.初识

WPS JSA 宏编程(JS):1.初识

2023-12-23 11:13| 来源: 网络整理| 查看: 265

一、简介

从 WPS 2021 版本开始,WPS 正式支持使用 JS 作为宏语言,官方称 JSA(报错时,用得就是这个名称),亦即 JS for Application 的缩写。

根据官方文档(https://open.wps.cn/docs/office)中的介绍,WPS 内嵌了一个 V8 引擎的 JavaScript 运行时,支持大部分 ES6 语法,实测支持到 ES2019:

WPS宏编辑器集成了一个V8 引擎的 JavaScript 运行时,支持大部分ES6语法,因此宏编辑器支持JavaScript 标准内置对象,注意,JS内置对象和浏览器的内置对象是不同的,WPS宏编辑器集成的是JavaScript 运行时,而不是浏览器,因此WPS宏编辑器不支持浏览器的内置对象。具体API参见https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects 。

JSA 也是 WPS 默认的宏语言,WPS 官方为之提供了 WPS 宏编辑器,以方便大家编辑 JSA 宏代码。

 

二、宏录制

如下示例是要给 B4 单元格字体颜色设为红色,背景色设置为黄色,录制的宏代码如下:

1 /** 2 * Macro1 Macro 3 * 宏由 nutix 录制,时间: 2021/07/17 4 */ 5 function Macro1() 6 { 7 Range("B4").Select(); 8 (obj=>{ 9 obj.Color = 255; 10 obj.TintAndShade = 0; 11 })(Selection.Font); 12 (obj=>{ 13 obj.Pattern = xlPatternSolid; 14 obj.Color = 65535; 15 obj.TintAndShade = 0; 16 obj.PatternColorIndex = -4105; 17 })(Selection.Interior); 18 19 }

第 8-11 和 第 12-17 行处的代码段,是定义箭头函数,以及对它们的调用。

宏录制器,总是会把对同一个对象的多个操作,以这种箭头函数的形式,录制出来。

这是复合写法,手工写 JSA 宏代码,肯定是不提倡这种写法的。

 

三、事件

这可能是大家打交道最频繁的,与 VBA 有所不同的是,现在没有文档模块了,WPS 宏编辑器只提供了一个入口来编写事,即

image

它订阅了当前工作簿 Workbook 的 SheetChange 事件,当第 1/2 表的第 4 列的值发生改变时,将单元格的字体颜色修改为蓝色,它的代码如下:

1 function Workbook_SheetChange(Sh, rg) 2 { 3 if ([1, 2].indexOf(Sh.Index) != -1) { 4 //对第1、2表D列的单元格值变更进行处理 5 const blue = 12611584; 6 if (rg.Column == 4) { 7 rg.Font.Color = blue; 8 } 9 } 10 }

与 VBA 的事件有所不同,WPS 中不内建文档模块,这里说的文档模块,就是你在 Office 的 VBE 中【工程管理器】里面的 Sheet1, Sheet2, ..., SheetN 和 ThisWorkbook,这 N+1 个内建的模块,VBE 里针对每一个打开的工作簿,都会内建一堆这样的文档模块,工作表及打开的工作簿如果比较多时,要查找自己的模块,还得去拖滚动条。

WPS 则以比较巧妙的方式,规避了这个问题:WPS 不内建任何模块,用户想要订阅事件,直接在事件栏里面选中即可,事件处理程序名称与参数,会更好地协助你做你想做的事儿。

 

四、用户窗体

image

WPS贴心地为大家新提供了几个控件,尤其是【水平布局控件】和【垂直布局控件】,有这两个控件,大家可以更好的设计窗体了。

要编写窗体及其控件的事件,和文档事件一样,通过事件栏,来指定要处理的控件的事件

image

由图可见WPS窗体的界面与代码是分离的,代码是写在普通模块里面的,绘制的窗体是在另一个模块

image

由上图可见,所有的对象,无论是Application(应用程序),Workbook(工作簿)、窗体、窗体控件、工作表控件,这些事件源,都是在同一个列表中,大家注意命名,以免混淆

 

五、自定义公式函数

为表格自定义公式函数是很简单的,只要返回常规类型(如文本,数字,日期,真假值即可),且是全局函数即可

1 /*删除给定文本的某字符及后面的字符 2 target : 要处理的目标 3 from : 要删除的起始字符 4 */ 5 function DeleteFrom(target, from) { 6 let value; 7 if (target.constructor.name == 'Range') { 8 //本公式只接受一个单元格引用 9 if (target.Areas.Count > 1 || 10 target.Areas.Item(1).Cells.Count > 1) 11 throw new Error('本函数只能处理一个单元格'); 12 else 13 value = target.Value().toString(); 14 } else 15 value = target.toString(); 16 17 if (from.constructor.name == 'Range') { 18 if (from.Areas.Count > 1 || 19 from.Areas.Item(1).Cells.Count > 1) 20 throw new Error('当 from 参数是一个单元格' + 21 '引用时,请确保它只包含一个单元格'); 22 from = from.Value().toString(); 23 } 24 else 25 from = from.toString(); 26 27 28 let index = value.indexOf(from); 29 if (index == -1) 30 return value; 31 else 32 return value.substr(0, index); 33 } 34 35 /*将单元格区域数据转换成一个基于文本的表 36 target : 要处理的单元格区域 37 sep : 分隔符 38 */ 39 function ToTextTable(target, sep = ',') { 40 if (target.constructor.name != 'Range') 41 throw new TypeError('target 参数必须是一个单元格区域'); 42 43 sep = sep.toString(); 44 let values = new Array(); 45 for (let iRow = 1; iRow


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有