[TOC]
> Sat May 01 2021 20:55:51 GMT+0800 (GMT+08:00)
為工作表創建目錄(實質是跳轉到指定工作表的超鏈接),我們用宏的方式批量創建,并利用工作表新增、刪除、重命名事件自動更新目錄。
> 跨工作簿的鏈接無法更新,因為工作表事件僅針對當前工作簿(除非雙向部署)
其實吧,目錄就是由超鏈接構成的,當工作表變多的時候定位比較困難,有個目錄就很方便了。
這里先提供低級版的(占用單元格)
> 可能會出加載項版的,窗體版的因 WPS JSAPI 缺少 UserForm 的說明,還不知道如何進行。
## 低配版目錄
> 會占用單元格。后續的章節提供“中配版”——窗體目錄。
為 WPS 表格 工作表插入目錄
注意,**目錄所在列不應再填入數據(它們會隨工作表數量變化而變化),有被覆蓋、清除的可能性。**
使用方法:
* 復制當前代碼到 WPS JS宏編輯器的模塊內。
* 新建你自己的宏,然后通過 new 使用。
* 要想變成"智能"目錄,請將宏加入到Application、Workbook級別的事件內部。
> "智能":隨工作簿工作表的增、刪、隱藏(取消隱藏)而更新目錄。
**Kind**: global class
* [shSummary](#shSummary)
* [new shSummary(anchor, options)](#new_shSummary_new)
* [.selectRange](#shSummary+selectRange)
* [.addToFirRange](#shSummary+addToFirRange)
* [.sHname](#shSummary+sHname)
* [.sH](#shSummary+sH)
* [.wb](#shSummary+wb)
* [._getWbNames()](#shSummary+_getWbNames)
* [._getSheetNames(wbName, ignoreHiddenOne)](#shSummary+_getSheetNames)
* [._clearRanges()](#shSummary+_clearRanges)
* [.thisWorkbookSummary()](#shSummary+thisWorkbookSummary)
* [.otherWorkbookSummary()](#shSummary+otherWorkbookSummary)
* [.addSummary()](#shSummary+addSummary)
<a name="new_shSummary_new"></a>
### new shSummary(anchor, options)
| Param | Type | Description |
| --- | --- | --- |
| anchor | <code>string</code> | 目錄插入點,例如:'Sheet1!A1' |
| options | <code>object</code> | |
| options.selectRange | <code>string</code> | 跳轉到的具體單元格名,例如:'A3',即跳轉后被選中的單元格,默認每個工作表的 A1 單元格。 |
| options.useNameAsLinkText | <code>boolean</code> | 僅使用工作表名稱作為鏈接文本(false則帶`selectRange`的值,true則只顯示表名),其他工作簿的鏈接始終帶有工作簿名(如果`forAllOpenedWorkbook`為 true的話)。 |
| options.ignoreHiddenSheets | <code>boolean</code> | 是否忽略隱藏工作表,默認 true:忽略(因為隱藏的工作表是無法顯示的,結果是“死鏈”點擊時會提示引用無效) |
| options.forAllOpenedWorkbook | <code>boolean</code> | 是否將所有的打開的工作簿都納入目錄(注意:本工作簿以外的工作簿的工作表事件無法監測,但會在生成更新本工作簿目錄時跑一遍其他工作簿),默認 false;不加入目錄。 |
**Example**
```js
function _m_addSummary(){
let summary = new shSummary("Sheet1!A1",{selectRange="A1"}) // 具體配置可以自行查看文檔(都有默認值,可不配置,僅提供目錄插入點即可)
summary.addSummary() // 創建目錄
}
```
<a name="shSummary+selectRange"></a>
### shSummary.selectRange
鏈接目標單元格
**Kind**: instance property of [<code>shSummary</code>](#shSummary)
<a name="shSummary+addToFirRange"></a>
### shSummary.addToFirRange
插入目錄區域的第一格
**Kind**: instance property of [<code>shSummary</code>](#shSummary)
<a name="shSummary+sHname"></a>
### shSummary.sHname
工作表名
**Kind**: instance property of [<code>shSummary</code>](#shSummary)
<a name="shSummary+sH"></a>
### shSummary.sH
目錄所在工作表
**Kind**: instance property of [<code>shSummary</code>](#shSummary)
<a name="shSummary+wb"></a>
### shSummary.wb
目錄所在工作簿
**Kind**: instance property of [<code>shSummary</code>](#shSummary)
<a name="shSummary+_getWbNames"></a>
### shSummary.\_getWbNames()
獲取當前打開的所有工作簿名稱(新建未保存工作簿將忽略)
**Kind**: instance method of [<code>shSummary</code>](#shSummary)
<a name="shSummary+_getSheetNames"></a>
### shSummary.\_getSheetNames(wbName, ignoreHiddenOne)
獲取某一工作簿所有工作表名稱。
**Kind**: instance method of [<code>shSummary</code>](#shSummary)
| Param | Type | Description |
| --- | --- | --- |
| wbName | <code>string</code> | 工作簿名稱 |
| ignoreHiddenOne | <code>boolean</code> | 是否忽略隱藏工作表 |
<a name="shSummary+_clearRanges"></a>
### shSummary.\_clearRanges()
清除目錄
**Kind**: instance method of [<code>shSummary</code>](#shSummary)
<a name="shSummary+thisWorkbookSummary"></a>
### shSummary.thisWorkbookSummary()
創建本(宏所在的)工作簿的目錄
**Kind**: instance method of [<code>shSummary</code>](#shSummary)
<a name="shSummary+otherWorkbookSummary"></a>
### shSummary.otherWorkbookSummary()
將其他工作簿納入目錄
**Kind**: instance method of [<code>shSummary</code>](#shSummary)
<a name="shSummary+addSummary"></a>
### shSummary.addSummary()
創建目錄
**Kind**: instance method of [<code>shSummary</code>](#shSummary)
## 代碼
```js
/**
* 為 WPS 表格 工作表插入目錄
*
* 注意,**目錄所在列不應再填入數據(它們會隨工作表數量變化而變化),有被覆蓋、清除的可能性。**
*
*
* 使用方法:
*
* * 復制當前代碼到 WPS JS宏編輯器的模塊內。
* * 新建你自己的宏,然后通過 new 使用。
* * 要想變成"智能"目錄,請將宏加入到Application、Workbook級別的事件內部。
*
* > "智能":隨工作簿工作表的增、刪、隱藏(取消隱藏)而更新目錄。
*
* @example
*
* function _m_addSummary(){
* let summary = new shSummary("Sheet1!A1",{selectRange="A1"}) // 具體配置可以自行查看文檔(都有默認值,可不配置,僅提供目錄插入點即可)
* summary.addSummary() // 創建目錄
* }
*
* @class
*/
class shSummary {
/**
*
* @param {string} anchor 目錄插入點,例如:'Sheet1!A1'
* @param {object} options
* @param {string} options.selectRange 跳轉到的具體單元格名,例如:'A3',即跳轉后被選中的單元格,默認每個工作表的 A1 單元格。
* @param {boolean} options.useNameAsLinkText 僅使用工作表名稱作為鏈接文本(false則帶`selectRange`的值,true則只顯示表名),其他工作簿的鏈接始終帶有工作簿名(如果`forAllOpenedWorkbook`為 true的話)。
* @param {boolean} options.ignoreHiddenSheets 是否忽略隱藏工作表,默認 true:忽略(因為隱藏的工作表是無法顯示的,結果是“死鏈”點擊時會提示引用無效)
* @param {boolean} options.forAllOpenedWorkbook 是否將所有的打開的工作簿都納入目錄(注意:本工作簿以外的工作簿的工作表事件無法監測,但會在生成更新本工作簿目錄時跑一遍其他工作簿),默認 false;不加入目錄。
*/
constructor(anchor, options = { selectRange: "A1", useNameAsLinkText: true, ignoreHiddenSheets: true, forAllOpenedWorkbook: false }) {
let a, b, c;
if (options.useNameAsLinkText == undefined || options.useNameAsLinkText == null) {
a = true
} else {
a = options.useNameAsLinkText
}
if (options.ignoreHiddenSheets == undefined || options.ignoreHiddenSheets == null) {
b = true
} else {
b = options.ignoreHiddenSheets
}
if (options.forAllOpenedWorkbook == undefined || options.forAllOpenedWorkbook == null) {
c = false
} else {
c = options.forAllOpenedWorkbook
}
/** 鏈接目標單元格*/
this.selectRange = options.selectRange || "A1"; // 默認為 A1
/** 插入目錄區域的第一格*/
this.addToFirRange = Range(anchor)
/** 工作表名*/
this.sHname = this.addToFirRange.Parent.Name;
/** 目錄所在工作表*/
this.sH = Worksheets.Item(this.sHname)
this.wbName = this.sH.Parent.Name;
/** 目錄所在工作簿*/
this.wb = Workbooks.Item(this.wbName)
this.useNameAsLinkText = a;
this.ignoreHiddenSheets = b;
this.forAllOpenedWorkbook = c;
/* this.useNameAsLinkText = options.useNameAsLinkText ?? true;
this.ignoreHiddenSheets = options.ignoreHiddenSheets ?? true;
this.forAllOpenedWorkbook = options.forAllOpenedWorkbook ?? false; */
}
/** 獲取當前打開的所有工作簿名稱(新建未保存工作簿將忽略)*/
_getWbNames() {
let n = [];
for (let i = 1; i <= Application.Workbooks.Count; i++) {
let item = Workbooks.Item(i).Name
if (item !== "") {
n.push(Workbooks.Item(i).Name)
}
}
return n;
}
/**
* 獲取某一工作簿所有工作表名稱。
* @param {string} wbName 工作簿名稱
* @param {boolean} ignoreHiddenOne 是否忽略隱藏工作表
*/
_getSheetNames(wbName, ignoreHiddenOne) {
let wb = wbName || this.wbName
let curWb = Workbooks.Item(wb)
let n = []
for (let i = 1; i <= curWb.Worksheets.Count; i++) {
let item = curWb.Worksheets.Item(i)
let ishidden = item.Visible
let iname = item.Name
if (ishidden && !ignoreHiddenOne) {
n.push([wbName, iname])
}
if (ishidden) {
n.push([wbName, iname])
}
}
return n;
}
/**
* 清除目錄
*/
_clearRanges() {
let summRang = this.addToFirRange;
let nextRisBlank = summRang.Offset(1, 0).Value() == null;
if (!nextRisBlank) {
Range(summRang, summRang.End(xlDown)).Value2 = undefined;
}
}
/**
* 創建本(宏所在的)工作簿的目錄
*/
thisWorkbookSummary() {
let TR = this.selectRange
let SR = this.addToFirRange
let igHidden = this.ignoreHiddenSheets
let useName = this.useNameAsLinkText
this._clearRanges()
// 開始寫入
let links = this._getSheetNames(this.wbName, igHidden)
if (links.length == 0) { return }
for (let i = 0; i < links.length; i++) {
let link_text;
let item = links[i][1]
if (useName) {
link_text = item
} else {
link_text = `${item}!${TR}`
}
let fo = {
link: `${item}!${TR}`,
text: link_text
}
let summitem = SR.Offset(i, 0)
let tSh = this.sH
tSh.Hyperlinks.Add(summitem, "", fo.link, "", fo.text)
}
}
/**
* 將其他工作簿納入目錄
*/
otherWorkbookSummary() {
if (this.forAllOpenedWorkbook == false) {
return
}
let allWb = this._getWbNames()
let fo = allWb.indexOf(this.sHname)
allWb.splice(fo, 1)// 剔除當前工作簿
let allWb_sheets = []
for (let i = 1; i <= a.length; i++) {
let item = a[i]
let item_SheetNames = this._getSheetNames(item, this.ignoreHiddenSheets)
allWb_sheets.push(item_SheetNames)
}
// 查找目錄末尾單元格
let lastRange = this.addToFirRange.End(xlDown)
for (let p = 0; p < allWb_sheets.length; p++) {
let ptem = allWb_sheets[i] // [wbname,shname]
let summaryLi_text
if (this.useNameAsLinkText) {
summaryLi_text = ptem.join('!')
} else {
summaryLi_text = `${ptem.join('!')}${this.selectRange}`
}
let summaryLi = {
text: summaryLi_text,
link: `[${ptem[0]}]${ptem[1]}!${this.selectRange}`
}
let nextSummaryAddTo = lastRange.Item(i, 0)
let summarySh = this.sH;
summarySh.Hyperlinks.Add(nextSummaryAddTo, "", summaryLi.link, "", summaryLi.text)
}
}
/**
* 創建目錄
*/
addSummary() {
// 先添加本工作表
this.thisWorkbookSummary()
// 接著補其他工作簿
this.otherWorkbookSummary()
}
}
```
- 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-鳴謝