Search code examples
google-apps-scriptgoogle-docs

Get user-selected text


I want to select words or lines by mouse in a Google Doc, and by script, get these selected words or lines.

Example:

  var doc = DocumentApp.getActiveDocument();
  var docText = doc.editAsText();
  var text = docText.getSelection();

I tried, but I didn't find any methods for selection access like in VBA.


Solution

  • The ability to work with cursor position and selected text was added yesterday, addressing Issue 2865: Get current user location & state information in Document. See the blog post as well.

    It turns out that there are some tricks to working with selections. I've tried to show them here - please add comments if you find any others, I'll gladly update.

    function onOpen() {
      DocumentApp.getUi().createMenu('Selection')
        .addItem("Report Selection", 'reportSelection' )
        .addToUi();
    }
    
    function reportSelection () {
      var doc = DocumentApp.getActiveDocument();
      var selection = doc.getSelection();
      var ui = DocumentApp.getUi();
      
      var report = "Your Selection: ";
    
      if (!selection) {
        report += " No current selection ";
      }
      else {
        var elements = selection.getRangeElements();
        // Report # elements. For simplicity, assume elements are paragraphs
        report += " Paragraphs selected: " + elements.length + ". ";
        if (elements.length > 1) {
        }
        else {
          var element = elements[0].getElement();
          var startOffset = elements[0].getStartOffset();      // -1 if whole element
          var endOffset = elements[0].getEndOffsetInclusive(); // -1 if whole element
          var selectedText = element.asText().getText();       // All text from element
          // Is only part of the element selected?
          if (elements[0].isPartial())
            selectedText = selectedText.substring(startOffset,endOffset+1);
          
          // Google Doc UI "word selection" (double click)
          // selects trailing spaces - trim them
          selectedText = selectedText.trim();
          endOffset = startOffset + selectedText.length - 1;
    
          // Now ready to hand off to format, setLinkUrl, etc.
    
          report += " Selected text is: '" + selectedText + "', ";
          report += " and is " + (elements[0].isPartial() ? "part" : "all") + " of the paragraph."
        }
      }
      ui.alert( report );
    }