You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 17:53:09