编辑文本和设置其样式

您可以使用文本范围(由 TextRange 类型表示)修改文本和为文本设置样式TextRange 表示形状或表格单元格内的一段文本。对形状或表格单元格调用 getText() 会返回涵盖整个文本的文本范围。

如果您使用方法修改文本在形状中的调整方式,则应用于形状的所有自动调整设置都会停用。

使用文本范围

文本范围有两个索引来分隔文本范围所涵盖的文本段:开始索引和结束索引。您可以使用 getStartIndex()getEndIndex() 函数确定这些索引。

如需读取文本范围的内容,请使用 asString()asRenderedString() 函数。

如需从文本范围内检索子范围,请使用 getRange() 函数。

以下脚本会在第一张幻灯片上创建一个文本框,并将其文本内容设置为“Hello world!”。然后,它会检索仅跨越“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);
}

形状或表格单元格返回的文本范围将始终覆盖整个文本,即使插入和删除了文本也是如此。因此,上面的示例会生成以下日志语句:

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

插入和删除文本

您还可以使用文本范围插入和删除文本形状和表格单元格。

  • insertText()appendText() 允许您插入文本。
  • setText() 会将文本范围的文本替换为提供的文本。
  • clear() 用于删除文本范围内的文本。

以下脚本演示了如何使用这些函数:

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);
}

此脚本会在第一张幻灯片上创建一个文本框,并将其文本内容设置为“Hello world!”。然后,它会删除字符 6 到 11(“world”),并在索引 6 处插入文本“galaxy”。上面的示例生成以下日志语句:

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

搜索和替换

对演示文稿或页面使用 replaceAllText() 函数可在整个演示文稿或特定页面中执行全局查找和替换。

TextRange 上的 find() 函数返回该范围内的字符串的实例。它可以与 setText() 结合使用,在形状或表格单元格中执行“查找和替换”。

段落、列表项和运行

TextRange 提供用于返回有用的文本实体集合的函数。其中一些函数包括:

  • getParagraphs(),,用于提供与文本范围重叠的所有段落。段落是以换行符“\n”结束的一系列文本。
  • getListParagraphs(),,用于返回当前文本范围中的列表项。
  • getRuns(),,用于提供与当前文本范围重叠的文本段。一段文本连接是一段文本,其中所有字符都采用相同的文本样式。

文本样式

文本样式决定了演示文稿中文本字符的呈现方式,包括字体、颜色和超链接。

文本范围的 getTextStyle() 函数提供用于设置文本样式的 TextStyle 对象。TextStyle 对象覆盖的文本与其父级 TextRange 相同。

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);
}

上面的示例首先在第一张幻灯片上创建了一个文本框,并将其内容设置为“Hello”,然后附加了文本“world!”。新附加的文本以粗体显示,链接到 www.example.com,并且其颜色设置为红色。

读取样式时,如果范围有多个样式值,该函数会返回 null。因此,上面的示例会生成以下日志语句:

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

还有许多其他样式可应用于文本。如需了解详情,请参阅 TextStyle 参考文档。

段落样式

段落样式可应用于整个段落,包括文本对齐和行间距等。TextRange 中的 getParagraphStyle() 函数提供了一个 ParagraphStyle 对象,用于设置与父文本范围重叠的所有段落的样式。

以下示例在第一张幻灯片上创建了一个包含四个段落的文本框,然后居中对齐前三个段落。

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);
}

列表样式

ParagraphStyle 类似,ListStyle 可用于设置与父文本范围重叠的所有段落的样式。

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);
}

以上示例在第一张幻灯片上创建了一个包含四个段落的文本框:第二个段落缩进一次,第三个段落缩进两次。然后将列表预设应用到所有段落。最后,系统会记录每个段落的嵌套级别。(段落的嵌套级别取决于段落文本之前的制表符数量。)因此,上述脚本会生成以下日志语句:

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