是的,您可以创建一个不可编辑的文本框,然后使用脚本在其中填充时间戳。
以下解决方案可能无法满足您的全部问题,可能只是第一个目标,但可以将想法转换为更好的脚本。
如果文本框放置在主视图中的布局中,则无法在幻灯片视图中对其进行编辑。
为了给你这个想法,我们将在主幻灯片布局中创建一个“不可编辑”文本框作为示例:
- 我们需要先获取幻灯片 ID。在我们的 Google 幻灯片文档中,记下其 URL 格式中的 ID
https://docs.google.com/presentation/d/{your slide id}/edit。使用{your slide id} 在脚本中定义常量SLIDE_ID。
- 要编辑主布局,我们必须从菜单
View > Master 启用主视图
- 在主视图中,我们会注意到“主”和“布局”列表下的幻灯片。从“布局”列表中选择第一个布局。第一个布局通常是主幻灯片布局。
- 在主幻灯片布局中,我们创建一个带有文本
Date 的文本框。我们首先使用文本来查找具有以下 Script 1 的文本框对象 id。在下图中,它是带有Date 文本的红色文本框。
脚本 1:
const SLIDE_ID = "{your slide id}";
//don't enable the debug log when running this script in production to speed up the processing
const ENABLE_DEBUG_LOG = true;
function findLayoutObjectIdByText_(text) {
var presentation = SlidesApp.openById(SLIDE_ID);
var layouts = presentation.getLayouts(); //layouts[0].getShapes()[0].getObjectId()
layouts.forEach(layout => { // iterate through every layout in the presentation
layout.getShapes().forEach(shape => { // iterate through every shape in the slide
const textStr = shape.getText().asString(); // get shape text string
const textObject = shape; // get shape text object
const matches = textStr.match(text); // find matches
if (matches != null) {
if (ENABLE_DEBUG_LOG) Logger.log("TEXT : " + textStr);
if (ENABLE_DEBUG_LOG) Logger.log("MATCH : " + textObject.getObjectId());
return; //a workaround since we can't use a break statement in forEach() loop
}
});
});
}
function openSlide() {
findLayoutObjectIdByText_(/^Date/g);
}
- 选择
Run > Debug > openSlide。在您的脚本编辑器几秒钟后,转到View > Logs 以查看“MATCH”的输出。比如对象id是ga66cd6addf_0_17
输出:
[20-11-01 12:21:09:042 HKT] TEXT : Date
[20-11-01 12:21:09:044 HKT] MATCH : ga66cd6addf_0_17
- 我们现在可以修改脚本1中
openSlide()函数中的代码如下:
修改后的脚本 1:
function openSlide() {
//findLayoutObjectIdByText_(/^Date/g); //comment it out once we are done
var presentation = SlidesApp.openById(SLIDE_ID);
var today = new Date();
var shape = presentation.getPageElementById("ga66cd6addf_0_17").asShape();
if (shape ! null) { //if the shape object present (not being removed)
shape.getText().setText(today.toLocaleDateString('en-US', {day: 'numeric', month: "short", year: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric'}));
}
}
- 选择
Run > Debug > openSlide。几秒钟后,我们可以看到文本框中的 Date 已更改为 Google 幻灯片文档中的正确时间戳,如下所示:
现在,我们可以将修改后的openSlide() 函数用作时间驱动触发器(如果脚本范围在 Google Slides 文档中)或作为事件触发器(如果脚本范围在 Google Form 或 Google Sheet 中)继续更新文本。当我们不在主视图中时,无法修改时间戳文本框。
不用脚本新建幻灯片,可以参考https://developers.google.com/slides/how-tos/create-slide。
重要的是确保使用上述想法编辑主视图中“布局”列表中的每个布局。每次学生从 Google 幻灯片文档创建新幻灯片时,新幻灯片都会自动检索您已包含在时间戳文本框中的分配的幻灯片布局(很可能是主视图中的第三个布局)。
下一个想法:如果您愿意,上述步骤可以变成一个完整的脚本,但我不会在这里介绍如何完成。
警告:由于每张新幻灯片都使用分配的默认幻灯片布局,我们将看到所有新创建的幻灯片的时间戳值相同。也许最好运行一个脚本,该脚本从 Google 表单的 onSubmit() 范围触发器执行,例如,学生在每个会话中提交他/她的出席情况。提交后,该脚本将从主/模板 Google 幻灯片文档中为学生复制一个 Google 幻灯片文档,该文档在布局中包含“日期”文本框,并在复制文档中的“日期”文本框上加上时间戳(如邮件合并的概念/document 在 Microsoft Word 中的书签)。该脚本只会作用于副本而不是主/模板。可以通过回复电子邮件或 Web 重定向提供指向此重复 Google 幻灯片文档的链接。您也可以在此重复文件中包含学生的姓名!因此,每个学生都将拥有自己的 Google 幻灯片文档,每次创建时都具有不同的当前时间戳。
查看https://developers.google.com/slides/how-tos/merge中的合并概念
注意:当我们授予学生编辑权限时,我们仍然无法避免学生在主视图中修改布局。