Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GAS is it possible to replace getActiveDocument().getSelection() at once?

My User has the following selection in his Gdoc.

enter image description here

Now from the sidebar he wants to to replace the selection he made on the document.
The GAS question is if it is possible to do that at once, something like:
var selection = DocumentApp.getActiveDocument().getSelection() selection.replace("newtext")
Or do I have to loop through selection.getRangeElements() in order to delete them (or replace them) and than in someway place the new text in that position?

like image 620
Jacobvdb Avatar asked Feb 06 '14 18:02

Jacobvdb


1 Answers

Not, that's not possible (well, if it is, it's not documented).

You have to loop through the selected elements, mainly because the selection may take part of paragraphs, forcing you to manage that. i.e. deleting just the selected part. And for completed selected elements, you can just remove them entirely (like images).

Here's an implementation on how to do this (part of the Kaylan's Translate script modified by me to properly replace images and partially selected paragraphs.

function replaceSelection(newText) {
  var selection = DocumentApp.getActiveDocument().getSelection();
  if (selection) {
    var elements = selection.getRangeElements();
    var replace = true;
    for (var i = 0; i < elements.length; i++) {
      if (elements[i].isPartial()) {
        var element = elements[i].getElement().asText();
        var startIndex = elements[i].getStartOffset();
        var endIndex = elements[i].getEndOffsetInclusive();
        var text = element.getText().substring(startIndex, endIndex + 1);
        element.deleteText(startIndex, endIndex);
        if( replace ) {
          element.insertText(startIndex, newText);
          replace = false;
        }
      } else {
        var element = elements[i].getElement();
        if( replace && element.editAsText ) {
          element.clear().asText().setText(newText);
          replace = false;
        } else {
          if( replace && i === elements.length -1 ) {
            var parent = element.getParent();
            parent[parent.insertText ? 'insertText' : 'insertParagraph'](parent.getChildIndex(element), newText);
            replace = false; //not really necessary since it's the last one
          }
          element.removeFromParent();
        }
      }
    }
  } else
    throw "Hey, select something so I can replace!";
}
like image 72
Henrique G. Abreu Avatar answered Nov 02 '22 04:11

Henrique G. Abreu