[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-鳴謝