使用 Google Apps 脚本在 Google 幻灯片上以一种形状混合文本和列表

问题描述 投票:0回答:1

我正在使用 Google Apps 脚本 (SlidesApp) 动态生成 Google 幻灯片演示文稿。

在其中一张幻灯片上,我需要混合文本和列表。 我更喜欢将它们保留在同一个文本区域中,因为它是我为本演示文稿创建的主题作为 Body 占位符元素提供的。

我现在遇到的主要问题是我似乎无法结束列表。

TextRange.appendText(text) 函数维护现有文本末尾的样式。 因此,一旦我将列表添加到文本框,接下来添加的任何内容也会添加到列表中。

我希望我可以做这样的事情来从新添加的文本中remove列表,但这会导致错误。

const textRange = SlidesApp.getActivePresentation()
                    .getSlides()[0]
                    .getPlaceholders()
                    .find((ph) => ph.asShape().getPlaceholderType() === SlidesApp.PlaceholderType.BODY)
                    .asShape()
                    .getText();

const head1 = textRange.appendText("HEADER A\n");
head1.getTextStyle()
     .setBold(true)
     .setForegroundColor(SlidesApp.ThemeColorType.ACCENT1)
     .setBackgroundColor(SlidesApp.ThemeColorType.LIGHT1);

const list1 = textRange.appendText(["item 1", "item 2", "item 3"].join('\n'));
list1.getTextStyle()
     .setBold(false)
     .setForegroundColor(SlidesApp.ThemeColorType.DARK1)
     .setBackgroundColor(SlidesApp.ThemeColorType.LIGHT1);
list1.getListStyle()
     .applyListPreset(SlidesApp.ListPreset.DISC_CIRCLE_SQUARE);

textRange.appendText("\n\n");

const head2 = textRange.appendText("HEADER B\n");
head2.getTextStyle()
     .setBold(true)
     .setForegroundColor(SlidesApp.ThemeColorType.ACCENT1)
     .setBackgroundColor(SlidesApp.ThemeColorType.LIGHT1);
head2.getListStyle()
     .applyListPreset(null); // <== THIS RESULTS IN AN ERROR

我想要达到的最终结果是

HEADER A

* item 1
* item 2
* item 3

HEADER B

* item x
* item y
* item z

我想避免使用 2 或 4 个占位符的另一个原因是列表大小是动态的,我不一定希望第一个列表和第二个标题之间有很大的间隙。

必须使用 2 个相同类型的占位符也会增加额外的复杂性,我不想参与其中。
例如,您不能假设您遇到的第一个 Body 占位符是顶部的。

google-apps-script google-apps google-slides google-slides-api
1个回答
0
投票

经过一番反复试验,我发现我应该最后做列表样式。

所以现在我有了这样的东西,而且效果很完美!

const textRange = SlidesApp.getActivePresentation()
                    .getSlides()[0]
                    .getPlaceholders()
                    .find((ph) => ph.asShape().getPlaceholderType() === SlidesApp.PlaceholderType.BODY)
                    .asShape()
                    .getText();

const head1 = textRange.appendText("HEADER A\n");
head1.getTextStyle()
     .setBold(true)
     .setForegroundColor(SlidesApp.ThemeColorType.ACCENT1)
     .setBackgroundColor(SlidesApp.ThemeColorType.LIGHT1);

const list1 = textRange.appendText(["item 1", "item 2", "item 3"].join('\n'));
list1.getTextStyle()
     .setBold(false)
     .setForegroundColor(SlidesApp.ThemeColorType.DARK1)
     .setBackgroundColor(SlidesApp.ThemeColorType.LIGHT1);

textRange.appendText("\n\n");

const head2 = textRange.appendText("HEADER B\n");
head2.getTextStyle()
     .setBold(true)
     .setForegroundColor(SlidesApp.ThemeColorType.ACCENT1)
     .setBackgroundColor(SlidesApp.ThemeColorType.LIGHT1);

const list2 = textRange.appendText(["item x", "item y", "item z"].join('\n'));
list2.getTextStyle()
     .setBold(false)
     .setForegroundColor(SlidesApp.ThemeColorType.DARK1)
     .setBackgroundColor(SlidesApp.ThemeColorType.LIGHT1);


// do styling as list LAST!
list1.getListStyle()
     .applyListPreset(SlidesApp.ListPreset.DISC_CIRCLE_SQUARE);
list2.getListStyle()
     .applyListPreset(SlidesApp.ListPreset.DISC_CIRCLE_SQUARE);
© www.soinside.com 2019 - 2024. All rights reserved.