乐于分享
好东西不私藏

WPS加载项(二)—改着用:宏脚本跑起来

WPS加载项(二)—改着用:宏脚本跑起来

    能用加载项的,就默认你有一丁丁点的wps jsa基础知识,其实无非也就3大件:工作簿Workbooks、工作表Worksheets、单元格Range,其他的也都是JavaScript的套用。
    直接把jsa宏脚本放到加载项中是基本跑不起来,即使是最简单的一个按钮对应的单元格写入,为什么也不成功?
function test(){Range("a1").Value2="hello 加载项!"}
  不熟悉开发的会被自我否定,是否需要高深的JavaScript知识?还需要框架、html、css?其实都不是的,主要是使用的环境不一样,有些东西不能省略。
function test(){Application.ActiveWorkbook.ActiveSheet.Range("a1").Value2="hello 加载项!"}
    加载项因为使用的是网页,所以他还有window的对象。而wps本身就和jsa宏里面的一样,顶层对象是Application(完整应该是这样wps.Application),环境不一样,所以不能省略,如上图,都需要写出来就基本不会有问题。以下列举几个目前我更改过程中常遇到的需要特别注意的地方:
一、缩写的区别

加载项

区别

ThisWorkbook

Application.ThisWorkbook

Application

Workbooks

Application.Workbooks

sht.Sheets(“汇总表”)

sht.Sheets.Item(“汇总表”)

Item

fd=FileDialog(msoFileDialogFolderPicker)

fd=Application.FileDialog(Application.Enum.msoFileDialogFolderPicker)

Enum

二、枚举的区别

加载项

End(xlUp)

End(-4162)或者End(3)

向上

End(xlDown)

End(-4121)或者End(4)

向下

End(xlToLeft)

End(-4159)或者End(1)

向左

End(xlToRight)

End(-4161)或者End(2)

向右

三、遍历的区别
在加载项中单元格、工作表无法用for of、map等方法遍历,他们不是可迭代对象,

加载项

for(let rg of rngs)

for (let i=1;  i<=cellCount;  i++)

for (let sheet of workbook.Sheets)

for (leti=1i<=workbook.Sheets.Count; i++

四、try catch的方法

大部分场景不会主动抛Error,而是返回undefined/null、静默失败,不会出发catch,比如像重命名的工作表已经存在。

现在的AI都比较智能(傻瓜?)像第三点AI基本都是无脑for,反倒不会出现这个错误,第一点如果习惯好,基本也不怎么需要改,AI也不会省略的,倒是涉及到Item的地方比较需要注意。