如何搜索和替换水平线和换行符

时间:2019-02-18 11:18:39

标签: google-apps-script google-docs

我需要自动删除在Google文档上被6个换行符(前3个,后3个)包围的所有水平线。

这段代码似乎在日志中放置了我要删除的正确换行符(这是第一步):

function myFunction() {
var doc = DocumentApp.getActiveDocument();
var body = doc.getBody().getText();
var pattern = /\s\s\s\s/g; 
  while (m=pattern.exec(body)) { Logger.log(m[0]); }
}

我有两个问题:

  • 我可以使用什么工具删除这些换行符(我还不了解使用replace或replaceText的细微之处,我的所有尝试都失败了吗?)

  • 如何将水平线添加到var模式(要删除的模式)中?我尝试了/ \ s \ s \ s \ sHorizo​​ntalRule \ s \ s \ s \ s / g,但当然没有用。

1 个答案:

答案 0 :(得分:1)

Horizontal rule是段落内(或有时在列表项内)的元素。由于它不是文本,因此无法通过正则表达式找到或替换。我们应该搜索在文档正文中专门排列的对象,并在找到后将其删除。

考虑以下代码示例:

function deleteHR() {
  var body = DocumentApp.getActiveDocument().getBody();
  var hr = null, hrArray = [], countDeleted = 0;

  // Collect all horizontal rules in the Document
  while (true) {
    hr = body.findElement(DocumentApp.ElementType.HORIZONTAL_RULE, hr);
    if (hr == null) break;
    hrArray.push(hr);
  }

  hrArray.forEach(function(hr) {
    var p = hr.getElement().getParent();
    // Get empty paragraphs as siblings (if any)
    var prevSiblings = getSiblings(p, 3, true),
        nextSiblings = getSiblings(p, 3, false);
    // Define a short function for batch deleting items
    function remove(e) {
      e.removeFromParent();
    }
    // If empty paragraphs exist (3 before and 3 after)
    if (prevSiblings.length == 3 && nextSiblings.length == 3) {
      // then delete them as well as the rule itself
      hr.getElement().removeFromParent();
      prevSiblings.forEach(remove);
      nextSiblings.forEach(remove);
      countDeleted++;
    }
  });
  // Optional report
  Logger.log(countDeleted + ' rules deleted');
}


// Recursive search for empty paragraphs as siblings
function getSiblings(p, n, isPrevious) {
  if (n == 0) return [];
  if (isPrevious) {
    p = p.getPreviousSibling();
  } else {
    p = p.getNextSibling();
  }
  if (p == null) return [];
  if (p.getType() != DocumentApp.ElementType.PARAGRAPH) return [];
  if (p.asParagraph().getText().length > 0) return [];
  var siblings = getSiblings(p, n - 1, isPrevious);
  siblings.push(p);
  return siblings;
}

主要功能deleteHR()完成所有工作。但是,使用另一个单独的函数getSiblings()进行递归搜索空段落似乎很有帮助。可能是,这种方法不是唯一的,但确实可行。