Editar e estilizar o texto

É possível editar e estilizar texto usando intervalos de texto, que são representados pelo tipo TextRange. Um TextRange representa um segmento de texto em uma forma ou em uma célula de tabela. Chamar getText() em uma forma ou célula de tabela retorna um intervalo de texto que abrange todo o texto.

Se você usar métodos que editam como o texto se encaixa em uma forma, todas as configurações de ajuste automático aplicadas à forma serão desativadas.

Como usar intervalos de texto

Um intervalo de texto tem dois índices que delimitam o segmento de texto coberto por um intervalo de texto: o índice inicial e o índice final. É possível determinar esses índices usando as funções getStartIndex() e getEndIndex().

Para ler o conteúdo de um intervalo de texto, use as funções asString() ou asRenderedString().

Para extrair um subintervalo de um intervalo de texto, use a função getRange().

O script a seguir cria uma caixa de texto no primeiro slide e define o conteúdo do texto como "Hello world!". Em seguida, ele recupera um subintervalo que abrange apenas "Hello".

slides/style/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);
}

O intervalo de texto retornado por uma forma ou célula de tabela sempre vai abranger o texto inteiro, mesmo que ele seja inserido e excluído. Assim, o exemplo acima produz as seguintes instruções de registro:

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

Inserir e excluir texto

Você também pode inserir e excluir formas de texto e células de tabela usando intervalos de texto.

  • insertText() e appendText() permitem inserir texto.
  • setText() substitui o texto de um intervalo de texto pelo texto fornecido.
  • clear() exclui texto de um intervalo de texto.

O script a seguir demonstra o uso dessas funções:

slides/style/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);
}

Esse script cria uma caixa de texto no primeiro slide e define o conteúdo dela como "Hello world!". Em seguida, ele exclui os caracteres de 6 a 11 ("world") e insere o texto "galaxy" no índice 6. O exemplo acima produz a seguinte instrução de registro:

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

Pesquisar e substituir

Use a função replaceAllText() na apresentação ou página para fazer uma pesquisa e substituição global em toda a apresentação ou em uma página específica.

A função find() em TextRange retorna as instâncias de uma string no intervalo. Ele pode ser usado com setText() para realizar a ação de localizar e substituir em uma forma ou célula de tabela.

Parágrafos, itens de lista e execuções

O TextRange oferece funções para retornar coleções úteis de entidades de texto. Algumas dessas funções incluem:

  • getParagraphs(),, que fornece todos os parágrafos que se sobrepõem ao intervalo de texto. Um parágrafo é uma sequência de texto que termina com o caractere de nova linha, "\n".
  • getListParagraphs(),, que retorna os itens da lista no intervalo de texto atual.
  • getRuns(),, que fornece as execuções de texto que se sobrepõem ao intervalo de texto atual. Uma execução de texto é um segmento de texto em que todos os caracteres têm o mesmo estilo de texto.

Estilo de texto

O estilo do texto determina a renderização dos caracteres na apresentação, incluindo fonte, cor e hiperlinks.

A função getTextStyle() de um intervalo de texto fornece um objeto TextStyle usado para estilizar texto. O objeto TextStyle cobre o mesmo texto que o TextRange pai.

slides/style/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);
}

O exemplo acima primeiro cria uma caixa de texto no primeiro slide e define o conteúdo dela como "Hello ". Em seguida, ele anexa o texto "world!". O texto recém-adicionado está em negrito, vinculado a www.example.com e a cor dele está definida como vermelho.

Ao ler estilos, a função retorna nulo se o intervalo tiver vários valores para o estilo. Assim, o exemplo acima produz as seguintes instruções de registro:

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

Há muitos outros estilos que podem ser aplicados ao texto. Mais detalhes podem ser encontrados na documentação de referência do TextStyle.

Estilo de parágrafo

Os estilos de parágrafo se aplicam a parágrafos inteiros e incluem elementos como alinhamento de texto e espaçamento entre linhas. A função getParagraphStyle() em TextRange fornece um objeto ParagraphStyle para estilizar todos os parágrafos que se sobrepõem ao intervalo de texto principal.

O exemplo a seguir cria uma caixa de texto no primeiro slide com quatro parágrafos e alinha ao centro os três primeiros.

slides/style/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);
}

Estilo de lista

Assim como ParagraphStyle, ListStyle pode ser usado para estilizar todos os parágrafos que se sobrepõem ao intervalo de texto principal.

slides/style/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);
}

O exemplo acima cria uma caixa de texto no primeiro slide, contendo quatro parágrafos: o segundo parágrafo tem um recuo e o terceiro tem dois. Em seguida, ele aplica uma predefinição de lista a todos os parágrafos. Por fim, o nível de aninhamento de cada parágrafo é registrado. O nível de aninhamento do parágrafo vem do número de tabulações antes do texto do parágrafo. Portanto, o script acima produz as seguintes instruções de registro:

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