Получить правильный выбранный пользователем текст в Google Docs Apps Script - PullRequest
0 голосов
/ 30 января 2020

Мне нужен полный текст пользовательского выбора в Документах Google, который может растягиваться на несколько строк.

Это отличается от этого вопроса: Получить выбранный пользователем текст , потому что в на этот вопрос требовалось получить текст отдельных слов или выделенных строк. Мне нужно иметь возможность обрабатывать несколько строк с правильным пробелом.

Я написал код ниже, и он почти работает, но он разбивает текст из двух строк вместе без символа новой строки (или чего-либо), разделяющего их , Он также не включает вкладки из исходного текста. Я предполагаю, что есть и другие ограничения, с которыми я не сталкивался!

function getSelectedText()
{
  var selection = DocumentApp.getActiveDocument().getSelection();
  if( !selection )
    return "";
  var selectedElements = selection.getRangeElements();

  var theText = "";  
  for( var i=0; i < selectedElements.length; i++ )
  {
    var thisText = selectedElements[i].getElement().asText().getText();
    if( selectedElements[i].isPartial() )
    {
      var thisText = thisText.substring( selectedElements[i].getStartOffset(), selectedElements[i].getEndOffsetInclusive() + 1)
    }
    theText += thisText;
  }

  return theText;  
}

Итак, допустим, у меня есть документ, который выглядит так со всем текстом, выбранным пользователем (с вкладкой во второй строке):

Line 1    
Line 2

Мой скрипт создаст строку "Line 1Line 2". Строка, которую я хотел бы видеть, это «Строка 1 \ nLine 2» или «Строка 1 \ rLine 2».

Ответы [ 3 ]

0 голосов
/ 03 февраля 2020

Мне удалось скопировать выделенный текст (с переносами строк и вкладками) со следующей модификацией вашего кода:

function myFunction() {
  var doc=DocumentApp.getActiveDocument();
  var selection = DocumentApp.getActiveDocument().getSelection();
  if( !selection )
    return "";
  var selectedElements = selection.getRangeElements(); 
  for( var i=0; i < selectedElements.length; i++ )
  {
    var thisText = selectedElements[i].getElement().asText().getText();
    doc.getBody().appendParagraph(thisText);
  }
}

На выбранных элементах вы получаете каждый из выбранных вами абзацев, скажем, 2 абзаца и вступление в середине. Затем вы добавляете каждый из этих элементов / абзацев в качестве нового абзаца.

Проверьте, работает ли это для вас, и дайте мне знать!

0 голосов
/ 05 февраля 2020

Ответ Кесси заставил меня предположить, что я переосмысливаю, что такое элементы, и что может быть целесообразно вручную добавить один возврат каретки между ними при построении строки. Вот мой оригинальный код с этой небольшой модификацией.

Пока это работает, но если мое предположение об элементах неверно, оно может потерпеть неудачу с текстом, отформатированным некоторым непроверенным способом. (Хотя, если текст отформатирован гораздо более сложным способом, может не иметь смысла иметь конкретную c и уникальную строковую версию его. Например, текст в таблице.)

function getSelectedText()
{
  var selection = DocumentApp.getActiveDocument().getSelection();
  if( !selection )
    return "";
  var selectedElements = selection.getRangeElements();
  var theText = "";

  for( var i=0; i < selectedElements.length; i++ )
  {
    var thisText = selectedElements[i].getElement().asText().getText();
    if( selectedElements[i].isPartial() )
      var thisText = thisText.substring( selectedElements[i].getStartOffset(), selectedElements[i].getEndOffsetInclusive() + 1)
    theText += thisText;
    //I'm assuming each element is separated by one carriage return.
    if( i+1 < selectedElements.length )
      theText += '\r';
  }
  return theText;
}
0 голосов
/ 30 января 2020

Эта функция взята из функции, которую я написал для выделения выделенного текста. Я изменил его, чтобы добавить выбранный текст обратно в документ, чтобы он мог отображаться в формате, отличном от html, который не будет отображать пробелы. Надеюсь, это будет полезно для вас.

function getCurrentSelection() {
  var doc=DocumentApp.getActiveDocument();
  var selection=doc.getSelection();
  var total="";
  if(selection) {
    var selectedElements = selection.getRangeElements();
    for(var i=0;i<selectedElements.length;i++) {
      var selElem = selectedElements[i];
      var el = selElem.getElement();
      var isPartial = selElem.isPartial();
      if(isPartial) {
        var selStart = selElem.getStartOffset();
        var selEnd = selElem.getEndOffsetInclusive();
      }else {
        var selStart = selElem.getStartOffset();
        var selEnd = selElem.getEndOffsetInclusive();
      }
      var elType=el.getType();
      if(elType==DocumentApp.ElementType.TEXT) {
        var txt = selElem.getElement().asText().getText().slice(selStart,selEnd+1);
      }
      if(elType==DocumentApp.ElementType.PARAGRAPH) {
        var txt = selElem.getElement().asParagraph().getText();
      }
      total+=txt;
    }
  }else {
    total='';
  }
  doc.getBody().appendParagraph(total);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...