Google Docs脚本求助:**包裹文本设粗体并移除标记失败
Google Docs Apps Script 粗体格式化脚本修复
问题概述
需求是将Google Docs中被**首尾包裹的关键词设置为粗体,并移除这些**标记,但提供的脚本运行时报错:
ReferenceError: javascript is not defined (anonymous) @ Bold text.gs:1
错误根源
这个错误大概率是脚本文件开头意外混入了javascript字符串,或者文件未正确设置为Google Apps Script格式(确保后缀为.gs)。同时原脚本本身存在逻辑缺陷:
paragraph.findText()未匹配到内容时会返回null,直接调用map()会抛出错误- 手动用
indexOf/lastIndexOf计算索引的方式,在删除文本后会导致索引偏移,操作出错 - 删除文本的顺序错误,先删前半部分
**会导致后半部分的索引位置失效
修复后的脚本
function formatTextAsBold() { const doc = DocumentApp.getActiveDocument(); const body = doc.getBody(); const paragraphs = body.getParagraphs(); paragraphs.forEach(paragraph => { const searchPattern = "\\*\\*(.*?)\\*\\*"; let match = paragraph.findText(searchPattern); // 循环处理当前段落内的所有匹配项 while (match) { const textElement = match.getElement().asText(); const startOffset = match.getStartOffset(); // 跳过前面的**,定位关键词起始位置 const boldStart = startOffset + 2; // 跳过后面的**,定位关键词结束位置 const boldEnd = match.getEndOffsetInclusive() - 2; // 为关键词设置粗体 textElement.setBold(boldStart, boldEnd, true); // 先删后面的**,避免影响前面的索引 textElement.deleteText(boldEnd + 1, boldEnd + 2); // 删除前面的** textElement.deleteText(startOffset, startOffset + 1); // 查找当前段落的下一个匹配项 match = paragraph.findText(searchPattern, match); } }); }
关键修复点
- 增加循环处理逻辑,通过
while遍历段落内所有匹配项,避免null报错 - 使用
match.getStartOffset()和match.getEndOffsetInclusive()获取精准匹配索引,替代手动查找 - 调整删除顺序:先删后半部分
**再删前半部分,避免索引偏移导致的错误 - 用正确的正则转义匹配
**(\\*\\*)
内容的提问来源于stack exchange,提问作者Dummy1234
相关产品推荐
相关产品推荐

