如何使用Word JS API删除书签?我的实现代码是否正确?(含报错)
Word JavaScript API 删除书签:代码问题修复及正确用法
你的代码为啥报错?
- 上下文过期:
setTimeout里的range对象已经失效了。Word.run执行完后,它内部创建的文档对象(比如这里的range)会和Word的上下文解绑,5秒后再调用range.deleteBookmark,对象已经不被Word识别,自然报错。 - API调用错误:
Range.deleteBookmark()不需要传书签名字——这个方法是删除当前范围绑定的书签。如果要按名字删书签,得用document.bookmarks.getItem("书签名").delete()。
正确删除书签的两种方式
1. 按名称删除指定书签
知道书签名字的话,直接定位删除:
Word.run(async (context) => { // 获取目标书签 const targetBookmark = context.document.bookmarks.getItem(item.bookmark); // 删除书签 targetBookmark.delete(); await context.sync(); }).catch(err => console.error("删书签失败:", err));
2. 删除选中区域的书签
如果要删除选中范围关联的书签,直接调用范围的deleteBookmark(不用传参):
Word.run(async (context) => { const selectedRange = context.document.getSelection(); // 删除选中范围的书签 selectedRange.deleteBookmark(); await context.sync(); }).catch(err => console.error("删书签失败:", err));
你的代码修正版(支持延迟删除)
要实现5秒后删除,必须重新启动Word.run创建新上下文,因为之前的上下文已经失效:
Word.run(async (context) => { console.log("result", result); const range = context.document.getSelection(); context.load(range); await context.sync(); const text = range.text; console.log("item", item.ImageId, text); if (item.ImageId === text) { console.log("item bookmark", item.bookmark); range.hyperlink = "#" + item.bookmark; await context.sync(); // 延迟5秒删除,重新开一个Word.run上下文 setTimeout(() => { Word.run(async (delayContext) => { console.log("setTimeout called"); // 重新获取书签并删除 const bookmarkToDelete = delayContext.document.bookmarks.getItem(item.bookmark); bookmarkToDelete.delete(); await delayContext.sync(); }).catch(err => console.error("延迟删书签失败:", err)); }, 5000); } else { console.log("range not matched"); } }).catch(err => console.error("操作失败:", err));
重要提醒
- 上下文有生命周期:
Word.run块里的对象只能在这个块里用,出了块就失效,必须重新创建上下文操作文档。 - 别忘加错误捕获:
Word.run后面加.catch,方便排查报错原因。 - API别用错:
Range.deleteBookmark()无参数,按名删书签找Bookmark对象调用delete()。
内容的提问来源于stack exchange,提问作者Vikash Choudhary
相关产品推荐
相关产品推荐

