编辑文本和设置其样式

您可以使用由 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