这可能不太可能,但我是一名教师,在工程设计笔记本上与学生一起工作。其中一个主要目标/要求是每个页面都有一个日期,该日期不应该由学生编辑。
我一直在寻找可以让我在Google幻灯片中自动显示日期的脚本,这就是我们正在构建笔记本模板的地方。
无论何时打开演示文稿,都有相当多的脚本可用于更新日期。
有人知道如何添加一个脚本,只在创建新幻灯片时才更新文本字段中的当前日期吗?例如:学生打开他们的数字谷歌幻灯片笔记本,然后他们点击CTRL+M或右键单击>新幻灯片。当新幻灯片弹出时,它会用当前日期自动填充日期字段,并且不能由学生编辑。
感谢你帮我指明正确的方向。
发布于 2020-11-01 12:59:14
可以,您可以创建一个不可编辑的文本框,然后使用脚本用时间戳填充它。
下面的解决方案可能不能满足你的整个问题,也许只是第一个目标,但这个想法可以转化为更好的脚本。
如果文本框放置在主视图的布局中,则无法在幻灯片视图中对其进行编辑。
为了给你这个想法,我们将在主幻灯片布局中创建一个“不可编辑”的文本框作为示例:
https://docs.google.com/presentation/d/{your slide id}/edit
的id。使用{your slide id}
在你的脚本中定义常量布局。Date
创建一个文本框。我们首先通过下面的脚本1使用文本来查找textbox对象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
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
在谷歌幻灯片文档中已被更改为正确的时间戳,如下所示:
现在,我们可以使用修改后的openSlide()
函数作为时间驱动的触发器(如果脚本作用域在谷歌幻灯片文档中)或事件触发器(如果脚本作用域在谷歌表单或谷歌工作表中),以不断更新文本。当我们不在主视图中时,不能修改时间戳文本框。
没有必要使用脚本创建新幻灯片,但您可以参考https://developers.google.com/slides/how-tos/create-slide。
重要的是要确保在主视图中编辑“布局”列表中的每个布局。每当学生从Google幻灯片文档创建新幻灯片时,新幻灯片将自动检索您已包含在时间戳文本框中的指定幻灯片布局(很可能是主视图中的第三个布局)。
Next idea:如果你愿意,上面的步骤可以变成一个完整的脚本,但我不会在这里介绍如何做到这一点。
警告:由于每个新幻灯片都使用指定的默认幻灯片布局,因此我们将看到所有新创建的幻灯片的时间戳值都相同。例如,运行一个从谷歌表单的onSubmit()
作用域触发器执行的脚本可能会更好,例如,在这个触发器中,学生提交他/她的出勤率。一旦提交,脚本将从主/模板Google幻灯片文档复制学生的Google幻灯片文档,该文档在布局中包含"Date“文本框,并在复制的文档中为"Date”文本框添加时间戳(类似于Microsoft Word中的邮件合并/文档书签的概念)。脚本只对副本起作用,而不对主/模板起作用。可以通过回复电子邮件或Web重定向提供指向此重复Google幻灯片文档的链接。您也可以在此重复文档中包含该学生的姓名!因此,每个学生都会有自己的Google幻灯片文档,每次创建时都会有不同的当前时间戳。
请参阅https://developers.google.com/slides/how-tos/merge中的合并概念
备注:当我们向学生授予编辑权限时,我们仍然无法避免他们修改母版视图中的布局。
https://stackoverflow.com/questions/64487501
复制相似问题