如何用Google Apps Script处理Google Docs中段落内的Markdown加粗?
解决Google Docs脚本中局部文本加粗的问题
你当前的核心问题是setBold(true)会将整段文本加粗,而Google Docs的段落文本支持通过TextRange精准控制局部样式,无需拆分段落元素。下面是具体的解决方案:
修正后的完整代码
function parseGoogleDocsFromMarkdown() { var doc = DocumentApp.getActiveDocument(); var body = doc.getBody(); var paragraphs = body.getParagraphs(); // 定义正则匹配规则 var heading1Pattern = /^# (.*)$/; var heading2Pattern = /^## (.*)$/; var boldPattern = /\*\*(.*?)\*\*/g; var italicPattern = /\*(.*?)\*/g; paragraphs.forEach(function(paragraph) { var text = paragraph.getText(); var originalText = text; // 保存原始文本用于位置计算 // 处理标题 if (heading1Pattern.test(text)) { var modifiedText = text.replace(heading1Pattern, "$1"); paragraph.setHeading(DocumentApp.ParagraphHeading.HEADING1); paragraph.setText(modifiedText); return; // 标题段落无需处理内联样式 } else if (heading2Pattern.test(text)) { var modifiedText = text.replace(heading2Pattern, "$1"); paragraph.setHeading(DocumentApp.ParagraphHeading.HEADING2); paragraph.setText(modifiedText); return; } // 处理加粗:先计算位置,再修改文本,最后设置样式 var boldMatches = [...originalText.matchAll(boldPattern)]; // 倒序处理,避免修改文本后位置偏移 for (var i = boldMatches.length - 1; i >= 0; i--) { var match = boldMatches[i]; var start = match.index; var contentLength = match[1].length; // 移除Markdown标记 paragraph.replaceText(match[0], match[1]); // 精准设置局部文本加粗 var textRange = paragraph.editAsText(); textRange.setBold(start, start + contentLength - 1, true); } // 处理斜体(同加粗逻辑) var italicMatches = [...originalText.matchAll(italicPattern)]; for (var j = italicMatches.length - 1; j >= 0; j--) { var match = italicMatches[j]; var start = match.index; var contentLength = match[1].length; paragraph.replaceText(match[0], match[1]); var textRange = paragraph.editAsText(); textRange.setItalic(start, start + contentLength - 1, true); } }); }
关键说明
- 使用TextRange精准控制样式:通过
paragraph.editAsText()获取文本编辑对象,用setBold(startIndex, endIndex, true)仅对指定索引区间的文本加粗,而非整段。 - 倒序处理匹配项:每次移除Markdown标记会改变文本长度,正序处理会导致后续匹配位置偏移,倒序处理可避免该问题。
- 位置计算逻辑:
- 原始文本中,
match.index是Markdown标记的起始位置 - 移除标记后,目标文本的起始位置不变,结束位置为
起始位置 + 内容长度 -1(因文本索引从0开始)
- 原始文本中,
- 标题段落跳过内联样式:标题无需处理加粗/斜体,处理完标题后直接跳出循环。
测试效果
运行脚本后,文档内容会自动转换为:
Headline 1(一级标题样式)
Secondary headline(二级标题样式)
Some bold text and some italic text(仅标记包裹的文本分别应用加粗、斜体样式,Markdown标记已移除)
Some more text on a new line.(普通段落样式)
内容的提问来源于stack exchange,提问作者Rasmus Puls
相关产品推荐
相关产品推荐

