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

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

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

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

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

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

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

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

слайды/стиль/стиль.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() удаляет текст из текстового диапазона.

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

слайды/стиль/стиль.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);
}

Этот скрипт создаёт текстовое поле на первом слайде и устанавливает его текстовое содержимое в значение «Hello world!». Затем он удаляет символы с 6 по 11 («world») и вставляет вместо них текст «galaxy» в индексе 6. В приведённом выше примере создаётся следующий лог-запись:

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

Поиск и замена

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

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

Абзацы, пункты списка и строки

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

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

Оформление текста

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

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

слайды/стиль/стиль.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);
}

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

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

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

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

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

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

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

слайды/стиль/стиль.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 можно использовать для стилизации всех абзацев, которые перекрывают родительский текстовый диапазон.

слайды/стиль/стиль.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