在 gDocs 中使用 gApp 脚本将光标移动到选择和 "Delete the next line"
Using gApp Scripts in gDocs to move cursor to Selection and "Delete the next line"
我尝试使用 google 应用程序脚本删除 Header 和 Body 文档部分的某些段落...但是,如果该段落是节中的最后一段存在异常:无法删除文档节中的最后一段。
但这正是我要删除的段落。
我曾尝试将本段与上一段合并,但遗憾的是它不起作用 - 该段仍然存在。
实现此目的的唯一有效方法是通过将光标放在上一行的末尾并按 "forward" 删除来手动删除该段落。这会毫无例外地删除下一行......但是我需要使用应用程序脚本自动执行此操作 - 所以我想问有没有办法在脚本中搜索元素然后模拟从那一点开始按下删除?这更像是一种技巧,但看不到另一种方法吗?
例如:
var foundElement = body.findText("Dialogue");
while (foundElement != null) {
// Get the text object from the element
var foundText = foundElement.getElement().asText();
// Where in the element is the found text?
var start = foundElement.getStartOffset();
var end = foundElement.getEndOffsetInclusive();
//PSUEDO CODE PRESS FORWARD DELETE TWICE FROM the **end** of the search phrase...
end.pressdelete(twice)
}
更新:
我能够通过遍历文档中的所有 header 来删除 header 段落 - 显然,可以有多个...
对话(截图2)后table中的空段落我还是卡住了...
var p = d.getBody().getParent();
var headers = [];
var footers = [];
// let's loop through all the child elements in the document including headers and footers etc...
for ( var i = 0; i < p.getNumChildren(); i += 1 ) {
var t = p.getChild(i).getType();
if ( t === DocumentApp.ElementType.BODY_SECTION ) continue; // not interested in the body
if ( t === DocumentApp.ElementType.HEADER_SECTION ) {
//OLD CODE FOR FIRST HEADER
if (headers.length > -1) {
headers.push(p.getChild(i).asHeaderSection())
}
var h = p.getChild(i).asHeaderSection().getText();
} else if ( t === DocumentApp.ElementType.FOOTER_SECTION ) {
var f = p.getChild(i).asFooterSection().getText();
}
}
function cleanHeaders(p) {
p.forEach(function(h, j, ar) {
var para = h.getParagraphs();
para.forEach(function(e, i, arr) {
var children = e.getNumChildren()
//Logger.log("::Children:: " + children);
if (children < 1) {
var t = e.getText();
var type = e.getType();
var parent = e.getParent();
var pChildren = parent.getNumChildren();
var childIndex = parent.getChildIndex(e);
//Logger.log("::Element::" + e + " ::Number:: " + i + " ::Type:: " + type + " ::Text:: " + t + " ::Children:: " + children + " ::Parent:: " + parent + " ::ParentChildren:: " + pChildren + " ::childIndex:: " + childIndex);
for ( var i = 0; i < parent.getNumChildren(); i += 1 ) {
Logger.log(parent.getChild(i));
if (i != 0) {
parent.getChild(i).asParagraph().merge();
}
}
if (parent != 'DocumentBodySection' && parent != 'HeaderSection') {
//e.getPreviousSibling().merge();
}
}
});
});
}
Logger.log("HEADERS: " + headers.length);
cleanHeaders(headers);
作为 Can't remove the last paragraph
的解决方法,您可以插入一个额外的虚拟段落
样本:
function myFunction() {
var body = DocumentApp.getActiveDocument().getBody();
body.appendParagraph('');
var foundElement = body.findText("TargetText at end of line");
while (foundElement != null) {
var foundText = foundElement.getElement().asText();
var paragraph = foundText.getParent();
paragraph.removeFromParent();
foundElement = body.findText("TargetText at end of line");
}
}
更新
如果要删除多个节的最后一段,可以执行catch..try
语句:
function myFunction() {
var body = DocumentApp.getActiveDocument().getBody();
var foundElement = body.findText("TargetText at end of line");
while (foundElement != null) {
var foundText = foundElement.getElement().asText();
var paragraph = foundText.getParent();
var parent = paragraph.getParent();
try{
paragraph.removeFromParent();
}catch(err){
body.appendParagraph('');
}
foundElement = body.findText("TargetText at end of line");
}
}
更新
要在 header 和 body 中删除 foundElement
之后的段落,包括表格,您可以使用以下代码:
function myFunction() {
var body = DocumentApp.getActiveDocument().getBody();
var foundElement = body.findText("TargetText at end of line");
while (foundElement != null) {
var foundText = foundElement.getElement().asText();
var paragraph = foundText.getParent();
var nextParagraph = paragraph.getNextSibling();
var parent = paragraph.getParent();
if(nextParagraph!= null && nextParagraph.getType()=="PARAGRAPH"){
try{
nextParagraph.removeFromParent();
}catch(err){
var dummyParagraph = body.appendParagraph('');
nextParagraph.removeFromParent();
dummyParagraph.merge();
}
}
foundElement = body.findText("TargetText at end of line", foundElement);
}
var header = DocumentApp.getActiveDocument().getHeader();
foundElement = header.findText("TargetText at end of line");
while (foundElement != null) {
var foundText = foundElement.getElement().asText();
var paragraph = foundText.getParent();
var nextParagraph = paragraph.getNextSibling();
var parent = paragraph.getParent();
if(nextParagraph!= null && nextParagraph.getType()=="PARAGRAPH"){
Logger.log(nextParagraph.asText().getText());
try{
nextParagraph.removeFromParent();
}catch(err){
var dummyParagraph = header.appendParagraph('');
nextParagraph.removeFromParent();
dummyParagraph.merge();
}
}
foundElement = header.findText("TargetText at end of line", foundElement);
}
}
我尝试使用 google 应用程序脚本删除 Header 和 Body 文档部分的某些段落...但是,如果该段落是节中的最后一段存在异常:无法删除文档节中的最后一段。
但这正是我要删除的段落。
我曾尝试将本段与上一段合并,但遗憾的是它不起作用 - 该段仍然存在。
实现此目的的唯一有效方法是通过将光标放在上一行的末尾并按 "forward" 删除来手动删除该段落。这会毫无例外地删除下一行......但是我需要使用应用程序脚本自动执行此操作 - 所以我想问有没有办法在脚本中搜索元素然后模拟从那一点开始按下删除?这更像是一种技巧,但看不到另一种方法吗?
例如:
var foundElement = body.findText("Dialogue");
while (foundElement != null) {
// Get the text object from the element
var foundText = foundElement.getElement().asText();
// Where in the element is the found text?
var start = foundElement.getStartOffset();
var end = foundElement.getEndOffsetInclusive();
//PSUEDO CODE PRESS FORWARD DELETE TWICE FROM the **end** of the search phrase...
end.pressdelete(twice)
}
更新:
我能够通过遍历文档中的所有 header 来删除 header 段落 - 显然,可以有多个...
对话(截图2)后table中的空段落我还是卡住了...
var p = d.getBody().getParent();
var headers = [];
var footers = [];
// let's loop through all the child elements in the document including headers and footers etc...
for ( var i = 0; i < p.getNumChildren(); i += 1 ) {
var t = p.getChild(i).getType();
if ( t === DocumentApp.ElementType.BODY_SECTION ) continue; // not interested in the body
if ( t === DocumentApp.ElementType.HEADER_SECTION ) {
//OLD CODE FOR FIRST HEADER
if (headers.length > -1) {
headers.push(p.getChild(i).asHeaderSection())
}
var h = p.getChild(i).asHeaderSection().getText();
} else if ( t === DocumentApp.ElementType.FOOTER_SECTION ) {
var f = p.getChild(i).asFooterSection().getText();
}
}
function cleanHeaders(p) {
p.forEach(function(h, j, ar) {
var para = h.getParagraphs();
para.forEach(function(e, i, arr) {
var children = e.getNumChildren()
//Logger.log("::Children:: " + children);
if (children < 1) {
var t = e.getText();
var type = e.getType();
var parent = e.getParent();
var pChildren = parent.getNumChildren();
var childIndex = parent.getChildIndex(e);
//Logger.log("::Element::" + e + " ::Number:: " + i + " ::Type:: " + type + " ::Text:: " + t + " ::Children:: " + children + " ::Parent:: " + parent + " ::ParentChildren:: " + pChildren + " ::childIndex:: " + childIndex);
for ( var i = 0; i < parent.getNumChildren(); i += 1 ) {
Logger.log(parent.getChild(i));
if (i != 0) {
parent.getChild(i).asParagraph().merge();
}
}
if (parent != 'DocumentBodySection' && parent != 'HeaderSection') {
//e.getPreviousSibling().merge();
}
}
});
});
}
Logger.log("HEADERS: " + headers.length);
cleanHeaders(headers);
作为 Can't remove the last paragraph
的解决方法,您可以插入一个额外的虚拟段落
样本:
function myFunction() {
var body = DocumentApp.getActiveDocument().getBody();
body.appendParagraph('');
var foundElement = body.findText("TargetText at end of line");
while (foundElement != null) {
var foundText = foundElement.getElement().asText();
var paragraph = foundText.getParent();
paragraph.removeFromParent();
foundElement = body.findText("TargetText at end of line");
}
}
更新
如果要删除多个节的最后一段,可以执行catch..try
语句:
function myFunction() {
var body = DocumentApp.getActiveDocument().getBody();
var foundElement = body.findText("TargetText at end of line");
while (foundElement != null) {
var foundText = foundElement.getElement().asText();
var paragraph = foundText.getParent();
var parent = paragraph.getParent();
try{
paragraph.removeFromParent();
}catch(err){
body.appendParagraph('');
}
foundElement = body.findText("TargetText at end of line");
}
}
更新
要在 header 和 body 中删除 foundElement
之后的段落,包括表格,您可以使用以下代码:
function myFunction() {
var body = DocumentApp.getActiveDocument().getBody();
var foundElement = body.findText("TargetText at end of line");
while (foundElement != null) {
var foundText = foundElement.getElement().asText();
var paragraph = foundText.getParent();
var nextParagraph = paragraph.getNextSibling();
var parent = paragraph.getParent();
if(nextParagraph!= null && nextParagraph.getType()=="PARAGRAPH"){
try{
nextParagraph.removeFromParent();
}catch(err){
var dummyParagraph = body.appendParagraph('');
nextParagraph.removeFromParent();
dummyParagraph.merge();
}
}
foundElement = body.findText("TargetText at end of line", foundElement);
}
var header = DocumentApp.getActiveDocument().getHeader();
foundElement = header.findText("TargetText at end of line");
while (foundElement != null) {
var foundText = foundElement.getElement().asText();
var paragraph = foundText.getParent();
var nextParagraph = paragraph.getNextSibling();
var parent = paragraph.getParent();
if(nextParagraph!= null && nextParagraph.getType()=="PARAGRAPH"){
Logger.log(nextParagraph.asText().getText());
try{
nextParagraph.removeFromParent();
}catch(err){
var dummyParagraph = header.appendParagraph('');
nextParagraph.removeFromParent();
dummyParagraph.merge();
}
}
foundElement = header.findText("TargetText at end of line", foundElement);
}
}