[TOC]
> Tue Jun 29 2021 00:04:54 GMT+0800 (GMT+08:00)
我自己也是萌新,代码的世界……哈喽,世界!
真正的大佬要么在忙着工作,要么在养老,他们极少有人愿意花时间去码字,只有我这种自以为很NB的人在“哗众取宠”……
我们来看看大家对 WPS 支持 JS宏 这件事情都有什么误解和期待?
> 注意,我说的是 WPS JS 宏(软件客户端宏),不是 WPS JS 加载项。
## WPS JS宏支持引入 JS 吗?
宏编辑器中有 "import", 试了又试,反正跑步起来……也许是我不会用
> 讨论:
>
> 其实引入外部 JS 并不实用,分享文件的时候总不能老是额外发一份 JS 文件吧。 如果可以,直接写进模块中即可。
>
> 但总归是一个需求,也许后面会支持吧。
## WPS JS宏支持"字典"吗?
> 最佳解决方案:使用 `Lodash`,详见本书:【`将 Lodash 装进 WPS JS宏`】
字典;VB 中的 Dictionary 对象,存储数据`键/项对`,也叫“`键/值对`”、`Key/Value`;那 WPS JS宏支持吗?答案是支持。
通常在 VBA 中使用 Dictionary 对象主要是利用它“键”唯一的特性,以及用来存储一些结构性的数据。
JavaScript 的 Object 天然具有 Dictionary 对象的特性,你可以选择跟 Dictionary 对象更类似的 JSON。
> 这是个伪命题,在 JavaScript 中使用 JSON,就是 JSON Object 化,终点依旧在 Object 上。
**`注意`**:
> JavaScript 的 Object 虽然有 Key/Value 特性,但 JavaScript Object 和 VB 的 Dictionary 对象不是同一类东西。
毫不夸张地说,JavaScript 在 Key/Value 方面,简直就是神一般的存在——不得不承认,我夸张了。JavaScript 弱类型的特性就很棒……
在 VBA 中,使用 Dictionary 之前你得:
```vb
Set dir = CreateObject("Scripting.Dictionary")
```
然后才能:
```vb
dir.Add "fir", "Hello,World"
```
在 JavaScript 中就没这么麻烦了……
### 简单!
```js
// 走走形式
let foo = {}
foo.assigin({fir:"Hello!World"})
Console.log(foo.fir)
```
还可以是这样的:
```js
let foo = {
bar:function(){
return "Hello,World!"
}
}
// 当然,这里一点都不 "字典"
foo.bar()
```
> 除了 Key 有限制外,Value 可以是任何类型……它可以更复杂地嵌套:
```js
let kv = {
a:{
a1:{
a11:{
bar:[1, 2, 3]
},
a12:{
amHere:"hello",
a12_1:{},
// 可以继续
}
}
},
b:{},
c:{},
d:{}
}
// 嵌套太深,会累死的;因为
// 当你要获取"hello" 时:
let hi = kv.a.a1.a12.amhere; // 就,就很长……
```
如果你真的喜欢 Key/Value,那么你可以尽情发挥:
```js
let data = {
a:[
{"a1": "a1"},
{"a2": "a2"},
{"a3": "a3"},
{"a4": [
{"gogo":[
{"a": 1},
{"b": 2}
]}
]}
],
b: "hello",
c: null,
d: false,
e: true
}
```
### 不够?可以直接上 JSON
> [了解什么是 JSON?](https://www.json.org/json-es.html)
核心:
1. `JSON.parse` ,解析 JSON 结构字符串;可以理解为 JSON 转 JavaScript 对象;
> JSON --> JavaScript Object
2. `JSON.stringify` ,JavaScriptn 对象 JSON 化,可以理解为 JavaScript 对象转 JSON。
> JavaScript Object --> JSON
```js
function _m_json() {
Console.clear()
let jsonContent = `
{
"KV":{
"a": 1,
"b": "1",
"c": "Hello",
"a-b": "a-b",
"a_b": "a_b",
"a b": "a b"
}
}
`;
let obj = JSON.parse(jsonContent)
Console.log(obj.KV.a)
Console.log(typeof (obj.KV.a))
Console.log(obj.KV["a-b"])
// -------
let foo = {
a:1,
b: null,
c: undefined,
d: false,
e: "1",
f: /[az]/g,
g: "hello",
h: (function (){
let p = new Date().getMonth()
return p
})(),
}
let foo2json = JSON.stringify(foo)
Console.log(foo2json)
}
```
运行之后,有何发现?
### 键值对更改
VB 中 Dictionary 对象有 Remove/RemoveAll 方法,可以操作Key/Value条目;在 JS 中则可以用 delete 方法。我们来看看
```js
function _m_jsObject(){
dir = {
"1": 1,
"2": 2,
"3": 3
}
delete dir["3"] // 删除"3"属性。
Console.log(dir["3"])
}
```
> 其实,我们很少会这么干,关于 [delete 更多介绍](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete)
通常地,你只需读取你要的就可以了,并不总是需要将其删除;比如,只读取 Key 为"1"、"2" 的项的值,则:
```js
let foo = [ dir['1'], dir['2'] ]
```
为什么不删呢?因为删变量、对象的属性影响是巨大的,看看下面的例子:
```js
function _m_why() {
let foo = {
a: 1,
b: 2,
c: 3
}
let bar = foo;
delete bar.c // 把 bar.c 删掉
// 获取所有的 Key
let keys_foo = Object.keys(foo)
let keys_bar = Object.keys(bar)
// 输出 key 的个数
Console.log(keys_foo.length) // 2
Console.log(keys_bar.length) // 2
}
```
> 找到原因了吗?
因为我们并不总是能时刻保持严谨,所以每当要"删除"的时候都很谨慎。甚至偷懒不删……下面来看看更新 Kay、Value的操作:
```js
function _m_changeObject() {
let foo = {
a: 1,
b: 2,
c: 3
}
// key c 改为 bar;
// 不介意 foo 的属性个数变多的改法:
foo['bar'] = foo.c
Console.log(`foo.bar --> ${foo.bar}`)
// 新建对象
let tar = {
a: foo.a,
b: foo.b,
bar: foo.c
}
// 以上的做法,foo.c 一直都在……
// 更改 Value
foo.a="123";
Console.log(foo.a)
}
```
> 注意 let、var、const 声明之间的区别,并不是什么都可以改的。
属性名(Key),通常我们都不会去动它,因为没有多大意义——我们只是需要这个key(属性)所代表的值;如果需要存储的数据键值对的key和Value都是有意义的,那么最好将将它们都作为 Value来存储,而不是将其中之一作为Key另一个作为Value,看下面的例子:
```js
let vipMembers = {
/* 这种做法,key成为数据的一部分
key自然很重要,但不建议,因为在
JavaScript 中,会发生key(属性名)丢失的情况——
当你使用某些 JS 扩展库时*/
zhangSan:{
name:"张三",
age: 30
}
}
// 不要将它们拆开:
let vipMembersA =[
{
userName: "zhangSan",
vipname:"张三",
age: 30
}
]
/*
let vipMembersA ={
"1":{
userName: "zhangSan",
vipname:"张三",
age: 30
},
"2":{
//...
}
}
*/
```
## WPS JS宏支持 JQuery 吗?
JQuery,操作 DOM 的,WPS JS 宏并没有 DOM 可操作,不支持。
## WPS JS宏支持 Node.js 吗?
Node.js 是 JavaScript 运行时,WPS JS宏也有自己的运行时,理论上 WPS JS 并不能使用用于 Node.js 的 JS 代码。
## WPS JS宏支持文件读写吗?
应该正在支持,只是还没有示例——甚至没有写进开发文档里:是已经支持只是没有更新开发文档,还是没有完成?无处得知……
不过,Open、Write、CurDir 等和 VB 一样的方法是已经有了的,只是缺少一个官方示例……
> WPS JS 加载项是已经支持了的。
## WPS JS宏支持 Lodash 吗?
**`支持`** ! 因为 Lodash 只是对 Array、Object 等标准 JavaScript 内置对象的扩展,不涉及其他 JS 库 API(比如 Web API、DOM等),所以可以直接用。你可以直接把 Lodash 发行版源码拷贝到 WPS JS宏模块中(也可以进行自定义定制构建打包)然后使用,参考本书 【`将 Lodash 装进 WPS JS宏`】章节。
## WPS JS宏支持 Ajax、Axios 吗?
WPS 客户端 JS宏 API 没有提供网络通信协议支持,所以任何基于 HTTP/HTTPS 网络协议的 JS 库都不被支持。XMLHttpRequest 并不是标准 JavaScript 内置对象/方法,它属于 WEB API。
## 总之
还是那句话:仅支持标准 JavaScript 扩展库和 WPS JS API 的自身扩展库(比如对现行 WPS 软件客户端 JS API 的进一步拓展和封装)
> WPS JS 加载项可以使用能运行在浏览器中的绝大多数 JS 库,覆盖率和浏览器基本一致。
- 1-概述
- 2-升级吧
- 3-阅读指南
- 4-答萌新问
- 5-iTool 加载项
- 6-iTool下载安装
- 7-Gitee token 生成
- 8-喜欢用表格当下载器的小伙伴看过来
- 9-喜欢扒数据的小伙伴跟上
- 10-了解 WPS JS宏编辑器
- 11-快捷键
- 12-立即窗口
- 13-断点调试
- 14-如何在 VB、JS 环境之间切换
- 15-如何快速进入使用、编辑JS宏
- 16-使用宏编辑器需要注意的点
- 17-保存&导出&使用宏
- 18-全局隐藏函数名(仅WPS)
- 19-如何命名自己的全局函数的名称(宏名)
- 20-如何使用别人写的宏
- 21-如何修改录制好的宏
- 22-WPS 宏中可用的 JS 库
- 23-将 Lodash 装进 WPS JS宏
- 24-使用 Moment.js
- 25-用 Papa Parse 进行JSON、CSV 互转
- 26-Lodash.js源码
- 27-Moment.js源码
- 28-papaparse.js源码
- 29-WPS JSAPI
- 30-对象名中英文对照表
- 31-事件汇总
- 32-对象属性的使用
- 33-从 Excel VBA 宏到 WPS JS宏
- 34-从 Visual Basic Script 转到 JavaScript
- 35-fileSystem文件系统
- 36-Open 与 Write
- 37-将内容写入 TXT 文件
- 38-Dir 函数读文件夹
- 39-关于颜色
- 40-表单、ActiveX控件
- 41-控件样式
- 42-数据绑定
- 43-解决“我是谁,我在哪”的问题
- 44-绕坑:那些奇奇怪怪的问题
- 45-警惕:宏操作对象限制
- 46-别造轮子了,用现成的吧
- 47-Item 属性快把你逼疯了吧
- 48-空单元格的值是什么
- 49-单元格区域(多个单元格)的值
- 50-编译参数禁止项开关导致的问题
- 51-代码上下文带来的问题
- 52-API 中方法函数参数的问题
- 53-结束进程吧
- 54-福利:WPS 表格 Modules 开箱即用
- 55-最后一格可用空单元格总在变?帮你追上它
- 56-判断一个单元格是不是在指定区域里
- 57-工作表类
- 58-单元格读取封装
- 59-WPS JS 加载项
- 60-加载项开发绕坑
- 61-开发
- 62-部署、分发
- 63-安装、卸载加载项
- 64-更智能的处理加载项的安装
- 65-WPS 控件点击之后报错:Error: arguments error
- 66-对 wpsjs npm 包的一些改进
- 67-加载项中 TaskPane 和 Dialog之间的差别
- 68-怎么解决 ShowDialog 窗口无限弹出?
- 69-Custom UI
- 70-控制控件在不同应用上的显示和隐藏
- 71-本地化处理
- 72-加载项示例和自建工具
- 73-如何保证在无 WEB 环境下加载项依旧正常工作
- 74-WPS 对 customUI 组件的支持程度
- 75-如何让加载项的 input 类元素准确关联 SheetSelectionChange 事件
- 76-从零开始开发一个简易的 JS 加载项
- 77-搭建项目
- 78-插件规划
- 79-第一个 ribbonUI 控件
- 80-第一个弹窗 confirm
- 81-第一个 Web 弹窗: ShowDialog
- 82-第一个侧栏 TaskPane
- 83-打包第一个版本
- 84-RibbonUI 控件不完全示例
- 85-基本结构
- 86-WPS JS加载项 RibbonUI 控件 API 与 VBE API 的差别
- 87-控件属性设计"误区"
- 88-主控:有条件加载 customUI.onLoad
- 89-布局盒子(父元素)
- 90-控件属性·事件·动作
- 91-简单示例
- 92-WPS 表格
- 93-单元格
- 94-如何描述单元格对象
- 95-单元格读写
- 96-单元格信息
- 97-关于合并单元格
- 98-合并单元格,I hate it!
- 99-单元格复制粘贴
- 100-选择性粘贴
- 101-自定义序列
- 102-单元格的删除/插入
- 103-单元格填充
- 104-单元格去重和高亮突出显示
- 105-单元格条件格式
- 106-数据透视表
- 107-自动筛选
- 108-通过 JS 宏处理 DISPIMG 函数
- 109-计时器:OnTime 和 Wait
- 110-探索: Range.Offset 如何安全“漂移”
- 111-表格自动化事件
- 112-创建一个事件记录日志工作表
- 113-实现类 Vlookup 单条件提取内容
- 114-代码和宏说明
- 115-创建工作表目录
- 116-将所有批注汇总成列表
- 117-JS宏代码
- 118-剥离 UDF 公式(数值化处理)
- 119-单元格区域转 JSON 并写入文件
- 120-JS宏代码
- 121-设置工作表标签(Tab)颜色
- 122-插入日历 calendar
- 123-再偷懒些
- 124-示例代码
- 125-WPS 表格函数表
- 126-JS 宏中可用的表格函数
- 127-WPS 表格-工作表-工作簿
- 128-通用简易工作表目录
- 129-工作表排序
- 130-巧用 Parent 进行对象锁定
- 131-我想要的 WPS 表格函数
- 132-单元格字符匹配统计
- 133-基于正则表达式的 Replace
- 134-身份证
- 135-控件 API 精讲(以表格为例)
- 136-窗体控件
- 137-ActiveX 控件
- 138-WPS 文档
- 139-"定位"专题
- 140-视图切换
- 141-别被 paragraph 骗了
- 142-无效脚注、尾注检测
- 143-获取所有标题
- 144-答网友问
- 145-轮序键入——键入完成自动切换单元格
- 146-又是一个很会偷懒的 Bigger Cousin
- 147-给你演示什么叫"画地为牢"
- 148-示例代码
- 149-如何批量超链接到同名的sheet?
- 150-如何将一个表中一个列的值合并到另一个表中的一个单元格中?
- 151-多个字符都往一个单元格里塞
- 152-wps如何将A列里包含B列的单元格高亮显示?
- 153-excel中随着打印份数渐序更新日期的函数?
- 154-就是玩儿
- 155-挖宝:寻找API文档中没有的接口
- 156-通过 Application 对象的属性获取信息
- 157-呵呵,失败的抽奖!
- 158-哪里不会点哪里
- 159-芝麻开门
- 160-乖,别闹,Stay here
- 161-JS宏 实现【WPS 表格 VIP 专享】功能挑战
- 162-工作表批量重命名
- 163-工作表标签批量着色
- 164-工作表拆分为工作簿
- 165-工作簿合并为工作表
- 166-WPS 表格 API 参考
- 167-Application.InpuBox
- 168-Worksheet(s)、Sheets
- 169-Range.End 精讲
- 170-Cells 精讲
- 171-WPS 文字 API 参考
- 172-怎么快速掌握 文字 宏API
- 173-WPS 宏编辑器 API 参考
- 174-InputBox
- 175-MsgBox
- 176-alert
- 177-WPS 扩展 API 参考
- 178-WebShape
- 179-通用 API 参考
- 180-WPS Office文件上传&下载 JavaScript 宏 API
- 181-JS宏API:Office(全网独一份)
- 182-公共部分
- 183-文字独有
- 184-JavaScript 语言基础笔记
- 185-国际化API(格式化处理)
- 186-数组
- 187-日期时间
- 188-数学计算
- 189-外接输入设备(读卡器、扫码枪)数据写进 WPS 可行性
- 190-鸣谢