Редактирование и стилизация текста

Вы можете редактировать и стилизовать текст, используя текстовые диапазоны , которые представлены типом TextRange . TextRange представляет собой сегмент текста внутри фигуры или ячейки таблицы. Вызов getText() для ячейки фигуры или таблицы возвращает текстовый диапазон, охватывающий весь текст.

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

Использование текстовых диапазонов

Текстовый диапазон имеет два индекса, которые ограничивают сегмент текста, охватываемый текстовым диапазоном: начальный индекс и конечный индекс . Вы можете определить эти индексы с помощью функций getStartIndex() и getEndIndex() .

Чтобы прочитать содержимое текстового диапазона, используйте функции asString() или asRenderedString() .

Чтобы получить поддиапазон из текстового диапазона, используйте функцию getRange() .

Следующий скрипт создает текстовое поле на первом слайде и устанавливает для его текстового содержимого значение «Hello world!». Затем он извлекает поддиапазон, охватывающий только слово «Hello».

слайды/стиль/style.gs
try {
  // Get the first slide of active presentation
  const slide = SlidesApp.getActivePresentation().getSlides()[0];
  // Insert shape in the slide with dimensions
  const shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 100, 200, 300, 60);
  const textRange = shape.getText();
  // Set text in TEXT_BOX
  textRange.setText('Hello world!');
  console.log('Start: ' + textRange.getStartIndex() + '; End: ' +
    textRange.getEndIndex() + '; Content: ' + textRange.asString());
  const subRange = textRange.getRange(0, 5);
  console.log('Sub-range Start: ' + subRange.getStartIndex() + '; Sub-range End: ' +
    subRange.getEndIndex() + '; Sub-range Content: ' + subRange.asString());
} catch (err) {
  // TODO (developer) - Handle exception
  console.log('Failed with an error %s ', err.message);
}

Текстовый диапазон, возвращаемый фигурой или ячейкой таблицы, всегда будет охватывать весь текст, даже если текст вставлен и удален. Таким образом, приведенный выше пример создает следующие операторы журнала:

Start: 0; End: 13; Content: Hello world!
Start: 0; End: 5; Content: Hello

Вставка и удаление текста

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

  • insertText() и appendText() позволяют вставлять текст.
  • setText() заменяет текст текстового диапазона предоставленным текстом.
  • clear() удаляет текст из текстового диапазона.

Следующий скрипт демонстрирует использование этих функций:

слайды/стиль/style.gs
try {
  // Get the first slide of active presentation
  const slide = SlidesApp.getActivePresentation().getSlides()[0];
  // Insert shape in the slide with dimensions
  const shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 100, 200, 300, 60);
  const textRange = shape.getText();
  textRange.setText('Hello world!');
  textRange.clear(6, 11);
  // Insert text in TEXT_BOX
  textRange.insertText(6, 'galaxy');
  console.log('Start: ' + textRange.getStartIndex() + '; End: ' +
    textRange.getEndIndex() + '; Content: ' + textRange.asString());
} catch (err) {
  // TODO (developer) - Handle exception
  console.log('Failed with an error %s ', err.message);
}

Этот скрипт создает текстовое поле на первом слайде и устанавливает для его текстового содержимого значение «Привет, мир!». Затем он удаляет символы с 6 по 11 («мир») и вместо этого вставляет текст «галактика» с индексом 6. В приведенном выше примере создается следующий оператор журнала:

Start: 0; End: 14; Content: Hello galaxy!

Искать и заменять

Используйте функцию replaceAllText() в презентации или на странице, чтобы выполнить глобальный поиск и замену по всей презентации или на конкретной странице.

Функция find() для TextRange возвращает экземпляры строки в диапазоне. Его можно использовать вместе с setText() для выполнения поиска и замены внутри ячейки фигуры или таблицы.

Абзацы, элементы списка и фрагменты

TextRange предоставляет функции для возврата полезных коллекций текстовых объектов. Некоторые из этих функций включают в себя:

  • getParagraphs(), который предоставляет все абзацы, перекрывающие текстовый диапазон. Абзац — это последовательность текста, оканчивающаяся символом новой строки «\n».
  • getListParagraphs(), который возвращает элементы списка в текущем текстовом диапазоне.
  • getRuns(), который предоставляет текстовые фрагменты, перекрывающие текущий текстовый диапазон. Текстовый фрагмент — это сегмент текста, в котором все символы имеют одинаковый текстовый стиль.

Стиль текста

Стиль текста определяет отображение текстовых символов в презентации, включая шрифт, цвет и гиперссылки.

Функция getTextStyle() текстового диапазона предоставляет объект TextStyle , используемый для стилизации текста. Объект TextStyle охватывает тот же текст, что и его родительский TextRange .

слайды/стиль/style.gs
try {
  // Get the first slide of active presentation
  const slide = SlidesApp.getActivePresentation().getSlides()[0];
  // Insert shape in the slide with dimensions
  const shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 100, 200, 300, 60);
  const textRange = shape.getText();
  // Set text in TEXT_BOX
  textRange.setText('Hello ');
  // Append text in TEXT_BOX
  const insertedText = textRange.appendText('world!');
  // Style the text with url,bold
  insertedText.getTextStyle()
      .setBold(true)
      .setLinkUrl('www.example.com')
      .setForegroundColor('#ff0000');
  const helloRange = textRange.getRange(0, 5);
  console.log('Text: ' + helloRange.asString() + '; Bold: ' + helloRange.getTextStyle().isBold());
  console.log('Text: ' + insertedText.asString() + '; Bold: ' +
    insertedText.getTextStyle().isBold());
  console.log('Text: ' + textRange.asString() + '; Bold: ' + textRange.getTextStyle().isBold());
} catch (err) {
  // TODO (developer) - Handle exception
  console.log('Failed with an error %s ', err.message);
}

В приведенном выше примере сначала создается текстовое поле на первом слайде, а для его содержимого устанавливается значение «Привет». Затем добавляется текст «мир!». Недавно добавленный текст выделен жирным шрифтом и связан с www.example.com , а его цвет установлен на красный.

При чтении стилей функция возвращает значение null, если диапазон содержит несколько значений стиля. Таким образом, приведенный выше пример создает следующие операторы журнала:

Text: Hello; Bold: false
Text: world!; Bold: true
Text: Hello world!; Bold: null

Существует множество других стилей, которые можно применить к тексту. Более подробную информацию можно найти в справочной документации TextStyle .

Оформление абзаца

Стили абзацев применяются ко всем абзацам и включают в себя такие элементы, как выравнивание текста и межстрочный интервал. Функция getParagraphStyle() в TextRange предоставляет объект ParagraphStyle для стилизации всех абзацев, перекрывающих родительский текстовый диапазон.

В следующем примере на первом слайде создается текстовое поле с четырьмя абзацами, а затем выравниваются по центру первые три абзаца.

слайды/стиль/style.gs
try {
  // Get the first slide of active presentation
  const slide = SlidesApp.getActivePresentation().getSlides()[0];
  // Insert shape in the slide with dimensions
  const shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 50, 50, 300, 300);
  const textRange = shape.getText();
  // Set the text in the shape/TEXT_BOX
  textRange.setText('Paragraph 1\nParagraph2\nParagraph 3\nParagraph 4');
  const paragraphs = textRange.getParagraphs();
  // Style the paragraph alignment center.
  for (let i = 0; i <= 3; i++) {
    const paragraphStyle = paragraphs[i].getRange().getParagraphStyle();
    paragraphStyle.setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER);
  }
} catch (err) {
  // TODO (developer) - Handle exception
  console.log('Failed with an error %s ', err.message);
}

Стиль списка

Подобно ParagraphStyle , ListStyle можно использовать для стилизации всех абзацев, которые перекрывают диапазон родительского текста.

слайды/стиль/style.gs
try {
  // Get the first slide of active presentation
  const slide = SlidesApp.getActivePresentation().getSlides()[0];
  // Insert shape in the slide with dimensions
  const shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 50, 50, 300, 300);
  // Add and style the list
  const textRange = shape.getText();
  textRange.appendText('Item 1\n')
      .appendText('\tItem 2\n')
      .appendText('\t\tItem 3\n')
      .appendText('Item 4');
  // Preset patterns of glyphs for lists in text.
  textRange.getListStyle().applyListPreset(SlidesApp.ListPreset.DIGIT_ALPHA_ROMAN);
  const paragraphs = textRange.getParagraphs();
  for (let i = 0; i < paragraphs.length; i++) {
    const listStyle = paragraphs[i].getRange().getListStyle();
    console.log('Paragraph ' + (i + 1) + '\'s nesting level: ' + listStyle.getNestingLevel());
  }
} catch (err) {
  // TODO (developer) - Handle exception
  console.log('Failed with an error %s ', err.message);
}

В приведенном выше примере на первом слайде создается текстовое поле, содержащее четыре абзаца: второй абзац имеет один отступ, а третий абзац — двойной. Затем он применяет предустановку списка ко всем абзацам. Наконец, регистрируется уровень вложенности каждого абзаца. (Уровень вложенности абзаца определяется количеством табуляций перед текстом абзаца.) Таким образом, приведенный выше сценарий создает следующие операторы журнала:

Paragraph 1's nesting level: 0
Paragraph 2's nesting level: 1
Paragraph 3's nesting level: 2
Paragraph 4's nesting level: 0