我需要自动删除在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 \ sHorizontalRule \ s \ s \ s \ s / g,但当然没有用。
答案 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()
进行递归搜索空段落似乎很有帮助。可能是,这种方法不是唯一的,但确实可行。