D21 - 如何用 Apps Script 自动化地创造与客制 Google Slides?(二)自动化爲铁人赛的每一篇贴文生封面图

今天的目标:在简报快速标上大量客制内容

今天要教要怎麽样快速改客户名称後交出投影片。 生活中我们不时需要「大量制作类似内容」,像是做要价格标示、日历或是名牌等。先来看看今天学完的结果会长这样——

这种大量重复的内容用 Google Sheet 来做的话,背後图片、色块颜色等不一定能参照;用 Google Docs 来做则要担心排版会跑掉。更别提当数量超过百张时,有没有什麽方式快速省时地做?比起一张张做,透过 GAS 可以帮你省点时间。今天会讲述如何透过 Google Sheet 调整参数,并让 Google Slides 自动客制。今天的关键提问只有一题——

  1. 如何依据「投影片范本」与「目标资料」来自动化 Slide 的创造?

那就让我们开始吧!


Q1. 如何依据「投影片范本」与「目标资料」来自动化 Slide 的创造?

主题目标设定——爲铁人赛的每一篇贴文设定一个 Cover Page!

今天在想主题时,就想到铁人赛的文章好像都缺乏了一个 Cover Page,想说趁这个机会来一鼓作气做完。希望可以帮助到每个铁人。

输入:

这边我们就来试着做铁人赛这三十篇(目前第二十一篇)文章的标题,首先我们在 Google Sheet 上打上我们要的格式。我将前面二十篇的文章整理成下列格式——

输出:

基本上这是我预期的输出样子,是用 Google slide 作成的投影片(也可以输出成图片)

我们暂时将上面这个版面,称作「Template 1」。因为我有些文章是属於同一系列的,我会想要加入多加入一些内容作为区隔,想像会是长这样——

那我将上面这份,称作「Template 2」。

基本的 Input / Output 设定好了,接着就是接起中间的 Process 了!

Step 1 从 Google Sheet 进入 GAS

那这次我们用 Google Sheet 进入 GAS,让我们借用 D14 的影片。

复习一下,每一个 Google 产品都有特定的 ID 如下图。

可以用我们下列的方式简单取得,如果想复习完整内容,在 D9: 如何用 Google Apps Script 自动化对 Google Drive 的操作?(一)列出所有档案 ID 与相关资讯 有完整的介绍可以参考。

这边我们就如法炮制将要更动的 Google Slides ID 抓入。

var target_presentation_ID = "your_presentation_id_here"

这边要多提一下的是,因为我们有两个范本,所以除了 target_slide_ID 之外,还要另外拿两个范本的 ID。两者的差异如下图——

要注意的是取的是 slide_id 的後段部分喔!程序码范例如下——

Uploading file..._ozsh1o0ql

var target_presentation__ID = "your_presentation_id_here";
var template_slide_ID_1 = "your_slide_ID_1";
var template_slide_ID_2 = "your_slide_ID_2";

怕大家还是有误解,这边影片再操作一次。

老样子,GAS 第一次执行时,会有「存取验证」需要大家按一下。这边仍是借用一下 D2 的影片。

设定好之後,就可以进入到我们的范本时间罗!

Step 2 用 GAS 读取 Google Sheet 要的资料

好,那我们接着就从 GAS 中读取 Google Sheet 的资料。直接上程序码与影片——

function readData(){
  let start_row = 2;
  let start_col = 1;
  let num_row = 21;
  let num_col = 2;
  let data = SpreadsheetApp.getActiveSheet().getRange(start_row, start_col, num_row, num_col).getValues();
  Logger.log(data)
  return data;
}

跑起来长这样——

这边如果有不熟,记得回 D4 - 如何透过 Google Apps Script 来整合 Google Form / Google Sheet 并自动寄出客制的 Email? 看看,里头有说明 Google Sheet 的架构与资料取得。

Step 3 用 GAS 复制一张范本投影片并调整文字

好,那当我们可以读近资料後,接着就是要将这段改成 Google Slide 中的一份份投影片。

我们先来看怎麽依据范本改投影片,先示范只改 Template 的,来上完整的程序码——

function buildNewSlideFromTemplate(){
  let pres = SlidesApp.openById(target_presentation_ID);
  let template_1 = pres.getSlideById(template_slide_ID_1);
  let new_slide = template_1.duplicate();
  rewriteWords(new_slide, "主文字区范本", "测试文字测试文字测试文字")
}

function rewriteWords(target_slide, target_text, replace_text) {
  let findText = target_text;
  let replaceText= replace_text;

  let page_elements = target_slide.getPageElements();
  for(page_element of page_elements){
    if(page_element.getPageElementType() == SlidesApp.PageElementType.SHAPE){
      let text_range = page_element.asShape().getText();
      Logger.log(text_range.asRenderedString());
      text_range.replaceAllText(findText, replaceText);
    }
  }
}

这段程序码的目的,是复制范本一创造一张新的 Slide,并将其中的「主文字区范本」改成「测试文字测试文字测试文字」。

跑起来长这样——

来细部拆解一下:

  1. 首先用 SlidesApp.openById() 透过 ID 取得我们要操作的 Presentation
  2. 再来用 .getSlideById() 透过 ID 取得我们的范本投影片
  3. 再来用 duplicate() 复制,并将复制的内容接上昨天所写的 rewriteWords(参考资料:D20 - 如何用 Apps Script 自动化地创造与客制 Google Slides?(一)架构拆解与更改文字

好,如果复制一张投影片OK,那接下来就是怎麽样大量复制并调整了。

Step 4 用 GAS 抓出 Sheet 中的资料,并用於自动化投影片的创造。

这边我们就要接起 Step 2 和 Step 3。这边一样先上程序码,先阅读看看。

function buildSlidesFromTemplate(){
  let pres = SlidesApp.openById(target_presentation_ID);
  let template_1 = pres.getSlideById(template_slide_ID_1);
  let template_2 = pres.getSlideById(template_slide_ID_2);

  let data = readData();

  for (row_data of data){
    let new_slide;
    if (row_data[0]==''){
      new_slide = template_1.duplicate();
      rewriteWords(new_slide, "主文字区范本", row_data[1])
    }else{
      new_slide = template_2.duplicate();
      rewriteWords(new_slide, "主文字区范本", row_data[1])
      rewriteWords(new_slide, "辅文字区范本", row_data[0])
    }
  }
}

跑起来的影片长这样——

看来是有成功。

好,那我们一样一步步来解析——

  1. 先设定好参数,用 ID 取得 Presentation (pres)、范本一(template_1)和范本二(template_1
  2. 再来,用 Step 2 的步骤取得 Sheet 中的资料,并用个 For 回圈一列列读出资料。读出的资料(row_data )就会是 [A2, B2] , [A3, B3] .... 以此类推。所以要取得 Google 中 A 栏的数值的话,要用 row_data[0], B 栏要用 row_data[1]。 这边不懂记得 D4、D4 还是提醒要看懂 D4。
  3. 用一个 if 来分流说,如果 Google Sheet 中「系列」(A 栏)这一栏没有数值的话,套用范本一,不然就套用范本二。
  4. 将 Step 3 的程序码接上去。

好,那这样就完成了快速复制我们全部的 Cover page 了!


好,那今天就到这边。今天我们主要学了:

  1. Google Slides 中 Slide 的 ID 位置与如何呼叫
  2. 结合 Google Sheet 中的资料来复制范本的投影片
  3. 针对每一个范本的投影片,再对其中元素进行客制化调整

其中第三点是有最多变化的可能,包含换图片、换表格、换背景颜色等...,但先用简单的文字让大家知道,其他的我们继续玩下去。

今天进入了 Slide 的第二天,希望对大家有所帮助。如果还有问题,透过留言之外,也可以到 Facebook Group,想开很久这次铁人赛才真的开起来,欢迎来当 Founding Member。如果不想错过可以订阅按赞小铃铛(?),也欢迎留言跟我说你还想知道什麽做法/主题。我们明天见。


<<:  [Day21] 网格交易机器人行前准备

>>:  Day 06 : 操作基础篇 3 - 认识「主题」与 CSS 客制化设定

拥抱传统,享受数位便利

不管是数位还是手写,各有各种的好处,端看每个人的需求。来看数位及传统载体的优劣势:手写的最大好处是在...

Day7 - 读 Concurrency is not Parallelism - Rob Pike (二)

续上篇,Day6 - 读 Concurrency is not Parallelism - Rob ...

[DAY 06] 盐水爱河 春天小栈

盐水爱河 春天小栈 地点:盐水区西门路7-1号 时间:11:00~22:00 还记得当时会找到这一家...

Day7 我想知道它哪里比我好很多 在你心中它和我有什麽不同

JavaScript feature 随着越来越深入JavaScript,现在所考察和学习到的co...

C#入门之文本处理(上)

作为一名 IT,和日志打交道是必不可少的,我们经常需要去查看一些日志文件,以从中获取一些有用的信息,...