【问题标题】:Using gApp Scripts in gDocs to move cursor to Selection and "Delete the next line"在 gDocs 中使用 gApp 脚本将光标移动到选择和“删除下一行”
【发布时间】:2020-04-17 13:03:49
【问题描述】:

我曾尝试使用谷歌应用脚​​本删除谷歌文档的标题和正文部分中的某些段落...但是,如果该段落是一个部分中的最后一个段落,则会出现异常:不能删除文档部分的最后一段。

而这正是我要删除的段落。

我已尝试将该段落与前一段合并,但它不起作用 - 该段落仍然存在。

实现这一目标的唯一有效方法是手动删除段落,方法是将光标放在上一行的末尾并按“前进”删除。这会毫无例外地删除下一行等...但是我需要使用应用程序脚本自动执行此操作 - 所以我问有没有办法在脚本中搜索一个元素,然后从该点模拟按下删除?这更像是一种 hack,但看不到另一种方法?

一个例子可能是:

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)       
}

更新:

我可以通过遍历文档中的所有标题来删除标题段落 - 显然,可以有多个...

对话后我仍然无法删除表格中的空段落(屏幕截图 2)...

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);

【问题讨论】:

    标签: google-apps-script google-docs


    【解决方案1】:

    作为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");    
      }
    }
    

    更新

    要删除标题和正文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);    
      }  
    }
    

    【讨论】:

    • 谢谢@ziganotschka - 但遗憾的是这并没有解决问题,也许我不够清楚。谷歌文档中有很多地方无法删除部分中的最后一段,而不会出现异常说您不能删除部分中的最后一段。此解决方案无法解决此问题,因此我建议使用解决方法。
    • 我明白了,在这种情况下,您可以通过在每次迭代期间执行 try-catch 语句来修改解决方法,添加空段落,请参阅我更新的答案。
    • 再次感谢@ziganotschka,但是,您的代码实际上删除了“搜索”文本以及需要删除的最后一段。
    • 那我想我误解了你的问题。您不想删除包含某个文本的段落,但要删除以下一段?如果包含文本的段落是一个部分的最后一个音调怎么办?然后要删除下一节的第一段吗?
    • 嘿@ziganotschka - 再次感谢!您的代码有效,但在我的情况下不起作用,因为我之前删除了一些书签并且不知何故 - 让事情变得有点奇怪......所以应该将您的答案标记为正确,因为它在基本案例场景中有效:) 非常感谢.
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多