Google apps script 如何搜索和替换水平规则和换行符
我需要自动删除谷歌文档中由6个换行符(3个前后换行符)包围的所有水平规则 这段代码似乎在日志中放入了我要删除的正确换行符(这是第一步):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]);} }是段落中的元素(有时是列表项中的元素)。由于它不是文本,因
函数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。奇怪的是,我创建了一个新文档,现在你的大代码工作得很好,我的注释中的小代码也很好(我想我可能没有指向代码执行的正确文档)。非常感谢你!