我正在使用 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 占位符是顶部的。
经过一番反复试验,我发现我应该最后做列表样式。
所以现在我有了这样的东西,而且效果很完美!
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);