首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google幻灯片中不可编辑的时间戳,基于演示文稿中新幻灯片的创建

Google幻灯片中不可编辑的时间戳,基于演示文稿中新幻灯片的创建
EN

Stack Overflow用户
提问于 2020-10-23 01:28:38
回答 1查看 133关注 0票数 1

这可能不太可能,但我是一名教师,在工程设计笔记本上与学生一起工作。其中一个主要目标/要求是每个页面都有一个日期,该日期不应该由学生编辑。

我一直在寻找可以让我在Google幻灯片中自动显示日期的脚本,这就是我们正在构建笔记本模板的地方。

无论何时打开演示文稿,都有相当多的脚本可用于更新日期。

有人知道如何添加一个脚本,只在创建新幻灯片时才更新文本字段中的当前日期吗?例如:学生打开他们的数字谷歌幻灯片笔记本,然后他们点击CTRL+M或右键单击>新幻灯片。当新幻灯片弹出时,它会用当前日期自动填充日期字段,并且不能由学生编辑。

感谢你帮我指明正确的方向。

EN

回答 1

Stack Overflow用户

发布于 2020-11-01 12:59:14

可以,您可以创建一个不可编辑的文本框,然后使用脚本用时间戳填充它。

下面的解决方案可能不能满足你的整个问题,也许只是第一个目标,但这个想法可以转化为更好的脚本。

如果文本框放置在主视图的布局中,则无法在幻灯片视图中对其进行编辑。

为了给你这个想法,我们将在主幻灯片布局中创建一个“不可编辑”的文本框作为示例:

  1. 我们需要先拿到幻灯片的id。从我们的谷歌幻灯片文档中,记下其URL格式为https://docs.google.com/presentation/d/{your slide id}/edit的id。使用{your slide id}在你的脚本中定义常量布局。
  2. 要编辑主布局,我们必须从主视图的菜单中启用主视图,我们将注意到“主视图”和“布局”列表下的幻灯片。从“布局”列表中选择第一个布局。第一种布局通常是主幻灯片布局。
  3. 在主幻灯片布局中,我们使用文本Date创建一个文本框。我们首先通过下面的脚本1使用文本来查找textbox对象id。在下图中,它是带有Date文本的红色文本框。

脚本1:

代码语言:javascript
运行
复制
    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);
      
    }

  1. 选择Run > Debug > openSlide。几秒钟后,从脚本编辑器中,转到View > Logs查看"MATCH“的输出。例如,对象id为ga66cd6addf_0_17

输出:

代码语言:javascript
运行
复制
[20-11-01 12:21:09:042 HKT] TEXT : Date

[20-11-01 12:21:09:044 HKT] MATCH : ga66cd6addf_0_17

  1. 我们现在可以修改Script 1openSlide()函数中的代码,如下所示:

修改后的脚本1:

代码语言:javascript
运行
复制
    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'}));
      }
    }

  1. 选择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中的合并概念

备注:当我们向学生授予编辑权限时,我们仍然无法避免他们修改母版视图中的布局。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64487501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档