Использование gApp Scripts в gDocs для перемещения курсора на «Выделение» и «Удалить следующую строку» - PullRequest
1 голос
/ 17 апреля 2020

Я пытался удалить некоторые абзацы в разделах «Заголовок» и «Тело» Google Do c, используя сценарии приложений Google ... однако, если абзац является последним абзацем в разделе, возникает исключение: Невозможно удалить последний абзац в разделе документа.

И все же это тот самый абзац, который я хочу удалить.

Я попытался объединить абзац с предыдущим абзацем, но, увы, он не работает - абзац остается.

Единственный эффективный способ достижения этой цели - удалить абзац вручную, поставив курсор в конце предыдущей строки и нажав «вперед» удалить. Это удаляет следующую строку без исключений и т. Д. c ... однако мне нужно автоматизировать это с помощью скрипта приложений - поэтому я спрашиваю, есть ли способ найти элемент в скрипте, а затем имитировать нажатие клавиши удаления из этой точки? Это скорее хак, но не вижу другого способа сделать это?

Примером может быть:

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

Error Msg Last Para inside Header Delete Para inside table First Para of Body and before table

ОБНОВЛЕНИЕ:

Мне удалось удалить абзац заголовка, просматривая все заголовки в do c - очевидно, их может быть больше одного ...

Я все еще застрял, удаляя пустой пункт в таблице после диалога (скриншот 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);

1 Ответ

2 голосов
/ 17 апреля 2020

В качестве обходного пути к 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");    
  }
}

UPDATE

Чтобы удалить абзацы, следующие за 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);    
  }  
}
...