Google文档AppScript:H2段落书签添加、去重及URL获取问题
解决重复创建书签与获取书签URL的方案
针对你的需求,我们需要实现两个核心功能:避免重复为H2段落创建书签,以及生成可直接访问的书签URL。以下是优化后的代码及关键说明:
关键思路
- 去重逻辑:先收集文档中所有已存在的书签对应的段落元素,遍历H2段落时跳过已书签化的元素。
- URL生成:Google文档的书签URL遵循固定格式,通过书签的
getId()方法获取唯一标识后即可拼接出完整链接。
完整代码
function addH2Bookmarks() { const docId = 'your document ID here'; const doc = DocumentApp.openById(docId); const body = doc.getBody(); const searchType = DocumentApp.ElementType.PARAGRAPH; const searchHeading = DocumentApp.ParagraphHeading.HEADING2; // 收集所有已书签化的段落元素 const bookmarkedElements = new Set(); doc.getBookmarks().forEach(bookmark => { const elem = bookmark.getPosition().getElement(); if (elem.getType() === searchType) bookmarkedElements.add(elem); }); const headingsData = []; let searchResult = null; while (searchResult = body.findElement(searchType, searchResult)) { const par = searchResult.getElement().asParagraph(); if (par.getHeading() === searchHeading) { let bookmarkUrl; if (!bookmarkedElements.has(par)) { // 为未书签化的段落创建新书签 const bookmark = doc.addBookmark(doc.newPosition(par, 0)); bookmarkUrl = `https://docs.google.com/document/d/${docId}/edit#bookmark=${bookmark.getId()}`; bookmarkedElements.add(par); } else { // 已有书签,直接获取对应URL const existingBookmark = doc.getBookmarks().find(b => b.getPosition().getElement() === par); bookmarkUrl = `https://docs.google.com/document/d/${docId}/edit#bookmark=${existingBookmark.getId()}`; } // 保存标题文本与书签URL headingsData.push({headingText: par.getText(), bookmarkUrl}); } } // 可在此处处理headingsData,例如打印日志或导出到Google表格 console.log('标题与书签URL:', headingsData); }
代码说明
- 去重处理:使用
Set存储已书签化的段落元素,判断是否需要创建新书签时只需O(1)时间复杂度,效率更高。 - URL拼接:书签URL格式为
https://docs.google.com/document/d/[文档ID]/edit#bookmark=[书签ID],其中bookmark.getId()返回书签的唯一标识符。 - 数据存储:
headingsData数组以对象形式保存每个H2标题的文本和对应书签URL,方便后续导出或使用。
内容的提问来源于stack exchange,提问作者Cienszki
相关产品推荐
相关产品推荐

