问题描述
这可能是一个远景,但是我是一位老师,与学生一起研究Engineering Design笔记本。主要目标/要求之一是每个页面上都有一个日期,并且该日期不应由学生编辑。
我一直在寻找能够使我自动在Google幻灯片中创建日期的脚本,
打开演示文稿时,有很多脚本可用于更新日期。
有人知道如何仅在创建新幻灯片时添加用于更新文本中当前日期的脚本吗?例如:学生打开其数字Google幻灯片笔记本,然后单击CTRL + M或右键单击>“新建幻灯片”。弹出新幻灯片时,它将用当前日期自动填充日期字段,并且学生无法对其进行编辑。
感谢您为我指明正确方向的帮助。
解决方法
是的,您可以创建一个不可编辑的文本框,然后使用脚本在其上填充时间戳。
下面的解决方案可能无法解决您的全部问题,可能只是第一个目标,但可以将其转换为更好的脚本。
如果文本框位于主视图的布局中,则无法在幻灯片视图中对其进行编辑。
为给您一个想法,我们将在主幻灯片布局中创建一个“不可编辑”文本框作为示例:
- 我们需要先获取幻灯片ID。在我们的Google幻灯片文档中,请注意其URL格式
https://docs.google.com/presentation/d/{your slide id}/edit
中的ID。使用{your slide id}
在脚本中定义常量SLIDE_ID
。 - 要编辑主布局,我们必须从菜单
View > Master
启用Master视图 - 在“母版”视图中,我们将注意到“母版”和“布局”列表下的幻灯片。从“布局”列表中选择第一个布局。通常,第一个布局是主幻灯片布局。
- 在主幻灯片布局中,我们创建一个文本为
Date
的文本框。我们使用文本首先使用以下脚本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幻灯片文档中)或用作事件触发器(如果脚本作用域位于Google Form或Google中表格)以不断更新文本。如果不在主视图中,则无法修改时间戳文本框。
不一定要使用脚本来创建新幻灯片,但是您可以参考https://developers.google.com/slides/how-tos/create-slide。
重要的是要确保使用上述想法编辑“主”视图中“布局”列表中的每个布局。每次学生从Google幻灯片文档中创建新幻灯片时,新幻灯片都会自动检索您已包含在时间戳文本框中的已分配幻灯片布局(很可能是“母版”视图中的第三个布局)。
下一个想法:如果您愿意,可以将上述步骤变成一个完整的脚本,但是在这里我不会介绍如何完成。
注意事项:由于每个新幻灯片都使用分配的默认幻灯片布局,因此我们将为所有新创建的幻灯片看到相同的时间戳值。也许最好运行一个脚本,该脚本是从Google表单的onSubmit()
范围触发器执行的,例如,学生为每个会话提交出勤记录。提交后,脚本将从主/模板Google幻灯片文档中为学生复制Google幻灯片文档,该文档已在布局中包含“日期”文本框,并在复制的文档中为“日期”文本框加上时间戳(例如mailmerge的概念) / document书签(在Microsoft Word中)。该脚本将仅对重复项起作用,而不对主模板/模板起作用。可以通过回复电子邮件或网络重定向来提供此重复的Google幻灯片文档的链接。您也可以在此重复文档中包含学生的姓名!因此,每位学生每次创建时都会拥有自己的Google幻灯片文档,并带有不同的当前时间戳。
请参阅https://developers.google.com/slides/how-tos/merge
中的合并概念注意:当我们授予学生编辑权限时,我们仍然无法避免学生修改“主视图”中的布局。