Google apps script 如何搜索和替换水平规则和换行符

Google apps script 如何搜索和替换水平规则和换行符,google-apps-script,google-docs,Google Apps Script,Google Docs,我需要自动删除谷歌文档中由6个换行符(3个前后换行符)包围的所有水平规则 这段代码似乎在日志中放入了我要删除的正确换行符(这是第一步): 函数myFunction(){ var doc=DocumentApp.getActiveDocument(); var body=doc.getBody().getText(); 变量模式=/\s\s\s/g; 而(m=pattern.exec(body)){Logger.log(m[0]);} }是段落中的元素(有时是列表项中的元素)。由于它不是文本,因

我需要自动删除谷歌文档中由6个换行符(3个前后换行符)包围的所有水平规则

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

函数myFunction(){
var doc=DocumentApp.getActiveDocument();
var body=doc.getBody().getText();
变量模式=/\s\s\s/g;
而(m=pattern.exec(body)){Logger.log(m[0]);}
}
是段落中的元素(有时是列表项中的元素)。由于它不是文本,因此无法通过正则表达式找到或替换它。我们应该搜索文档正文中特别排列的对象,如果发现,则将其删除

考虑以下代码示例:

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()
完成所有工作。但是,使用另一个单独的函数
getsibles()
递归搜索空段落似乎很有帮助。可能是这样,这不是唯一的方法,但它是有效的。

软中断(\r)或硬中断(\n)?硬中断(\n),用回车键进行。非常感谢,这里对我来说有很多新东西,所以我无法理解你所做的每件事。但是我试图用这段代码删除一条水平规则:
函数deleteOneHR(){var body=DocumentApp.getActiveDocument().getBody();hr=null;hrArray=[];hr=body.findElement(DocumentApp.ElementType.horizontal_rule,hr);hr.getElement().removeFromParent();Logger.log(hr);}
没有显示错误,日志显示RangeElement,但我的文档中只有一行水平线不会被删除。我不知道为什么。我不能检查你的文档,但上面的代码确实从我的文档中删除了hr。奇怪的是,我创建了一个新文档,现在你的大代码工作得很好,我的注释中的小代码也很好(我想我可能没有指向代码执行的正确文档)。非常感谢你!