【问题标题】:Non-Editable Timestamps in Google Slides based on creation of a new slide in a presentation基于在演示文稿中创建新幻灯片的 Google 幻灯片中的不可编辑时间戳
【发布时间】:2020-10-22 17:28:37
【问题描述】:

这可能是一个远景,但我是一名教师,与学生一起研究工程设计笔记本。主要目标/要求之一是每个页面都有一个日期,并且该日期不应由学生编辑。

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

有很多脚本可以在您打开演示文稿时更新日期。

有谁知道如何添加一个脚本来更新文本字段中的当前日期,仅在创建新幻灯片时?例如:学生打开他们的数字 Google 幻灯片笔记本,然后单击 CTRL+M 或右键单击 > 新幻灯片。当新幻灯片弹出时,它会使用当前日期自动填充日期字段,并且学生无法编辑。

感谢您为我指明正确方向的任何帮助。

【问题讨论】:

标签: google-slides-api google-slides


【解决方案1】:

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

以下解决方案可能无法满足您的全部问题,可能只是第一个目标,但可以将想法转换为更好的脚本。

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

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

  1. 我们需要先获取幻灯片 ID。在我们的 Google 幻灯片文档中,记下其 URL 格式中的 ID https://docs.google.com/presentation/d/{your slide id}/edit。使用{your slide id} 在脚本中定义常量SLIDE_ID。
  2. 要编辑主布局,我们必须从菜单View > Master 启用主视图
  3. 在主视图中,我们会注意到“主”和“布局”列表下的幻灯片。从“布局”列表中选择第一个布局。第一个布局通常是主幻灯片布局。
  4. 在主幻灯片布局中,我们创建一个带有文本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);
      
    }
  1. 选择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. 我们现在可以修改脚本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'}));
      }
    }
  1. 选择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中的合并概念

注意:当我们授予学生编辑权限时,我们仍然无法避免学生在主视图中修改布局。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多