編輯文字並設定樣式

使用文字範圍 (以 TextRange 型別表示) 編輯及設定文字樣式。TextRange 代表形狀或表格儲存格中的一段文字。在形狀或表格儲存格上呼叫 getText 會傳回涵蓋整個文字的文字範圍。

如果使用可編輯文字在形狀內顯示方式的方法,系統會停用套用至形狀的任何自動調整大小設定。

使用文字範圍

文字範圍有兩個索引,可劃分文字範圍涵蓋的文字區段:起始索引結束索引。使用 getStartIndexgetEndIndex 函式判斷這些索引。

文字範圍的起始索引包含在內,結束索引則不包含在內。這兩個索引都是從零開始。

如要讀取文字範圍的內容,請使用 asStringasRenderedString 函式。

如要從文字範圍內擷取子範圍,請使用 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

插入及刪除文字

您可以使用文字範圍,在圖案和表格儲存格中插入及刪除文字。

  • insertTextappendText 可讓你插入文字。
  • 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,且顏色會設為紅色。

讀取樣式時,如果範圍內有多個樣式值,函式會傳回空值。因此,這個範例會產生下列記錄陳述式:

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