Скрипт Google Apps: как Скопировать текст и сохранить форматирование?


Рассмотрим документ, представленный следующими 3 строками.

..некоторый текст..
6 7 8 9 10 11
..некоторый текст..

Представьте, что все числа имеют соответствующие размеры шрифта(т. е. 10-это размер шрифта 10). Теперь я хочу вставить встроенное изображение в пространство между 8 и 9 и удалить это пространство, но не уничтожить форматирование(размеры в этом примере) незатронутого текста. Результатом будет

..некоторый текст..
6 7 89 10 11
..некоторый текст..

Однако, когда я пытаюсь

function placeImage() {
  var s = DocumentApp.getActiveDocument().getBody();

  //Find in Document
  var found = s.findText("8");
  if(found==null)
    return 0; 
  var foundLocation = found.getStartOffset(); //position of image insertion

  //Get all the needed variables
  var textAsElement = found.getElement(); 
  var text = textAsElement.getText();
  var paragraph = textAsElement.getParent();
  var childIndex = paragraph.getChildIndex(textAsElement);  //gets index of found text in paragraph

  //Problem part - when removing the space, destroys all formatting
  var textRemaining = text.substring(foundLocation + 2);
  textAsElement.deleteText(foundLocation, text.length-1);
  if(textRemaining != "")
      paragraph.insertText(childIndex+1, textRemaining);//destroys formatting for the rest of the child index

  //Insert image
  var imgSource = UrlFetchApp.fetch("https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/Red_information_icon_with_gradient_background.svg/48px-Red_information_icon_with_gradient_background.svg.png");
  var ingBlob = imgSource.getBlob();
  paragraph.getChild(childIndex+1).insertInlineImage(foundLocation, ingBlob);
}

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

Я исследовал много других мест, оба ответа здесь не сохраняют форматирование и положение.insertInlineImage (), кажется, сломан, как и просил здесь .

1 2

1 ответ:

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

Он хорошо вставляет изображение,а также не изменяет форматирование остальной части текста.

Проверьте код ниже:

function placeImage()
 {
 var s = DocumentApp.getActiveDocument().getBody();
 var number = '8'
 //Find in Document
 var found = s.findText(number);
 if(found==null)
   return 0; 
 var foundLocation = found.getStartOffset(); //position of image insertion

 //Get all the needed variables
 var textAsElement = found.getElement(); 
 var text = textAsElement.asText().copy();// getText();
 textAsElement.editAsText().deleteText(foundLocation + number.length  ,textAsElement.asText().getText().length -1)

text.asText().editAsText().deleteText(0, foundLocation + 1 );
 //Insert image
 var imgSource = UrlFetchApp.fetch('https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/Red_information_icon_with_gradient_background.svg/48px-Red_information_icon_with_gradient_background.svg.png');
 var ingBlob = imgSource.getBlob();

 var children =DocumentApp.getActiveDocument().getBody().getChild(0).asParagraph().appendInlineImage(ingBlob);

 DocumentApp.getActiveDocument().getBody().getChild(0).asParagraph().appendText(text);

 var child = DocumentApp.getActiveDocument().getBody().getNumChildren();


}

Содержание документа проверяется следующим образом:

6 7 8 9 10 11

(размер текста аналогичен тому, что вы упомянули. '8' - это размер 8 и так далее)

Вы должны проверить, используя метод проб и ошибок. согласно содержанию вашего документа.

Надеюсь, это поможет!