今天要教要怎麽样快速改客户名称後交出投影片。 生活中我们不时需要「大量制作类似内容」,像是做要价格标示、日历或是名牌等。先来看看今天学完的结果会长这样——
这种大量重复的内容用 Google Sheet 来做的话,背後图片、色块颜色等不一定能参照;用 Google Docs 来做则要担心排版会跑掉。更别提当数量超过百张时,有没有什麽方式快速省时地做?比起一张张做,透过 GAS 可以帮你省点时间。今天会讲述如何透过 Google Sheet 调整参数,并让 Google Slides 自动客制。今天的关键提问只有一题——
那就让我们开始吧!
今天在想主题时,就想到铁人赛的文章好像都缺乏了一个 Cover Page,想说趁这个机会来一鼓作气做完。希望可以帮助到每个铁人。
这边我们就来试着做铁人赛这三十篇(目前第二十一篇)文章的标题,首先我们在 Google Sheet 上打上我们要的格式。我将前面二十篇的文章整理成下列格式——
基本上这是我预期的输出样子,是用 Google slide 作成的投影片(也可以输出成图片)
我们暂时将上面这个版面,称作「Template 1」。因为我有些文章是属於同一系列的,我会想要加入多加入一些内容作为区隔,想像会是长这样——
那我将上面这份,称作「Template 2」。
基本的 Input / Output 设定好了,接着就是接起中间的 Process 了!
那这次我们用 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 的後段部分喔!程序码范例如下——
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 的影片。
设定好之後,就可以进入到我们的范本时间罗!
好,那我们接着就从 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 的架构与资料取得。
好,那当我们可以读近资料後,接着就是要将这段改成 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,并将其中的「主文字区范本」改成「测试文字测试文字测试文字」。
跑起来长这样——
来细部拆解一下:
SlidesApp.openById()
透过 ID 取得我们要操作的 Presentation.getSlideById()
透过 ID 取得我们的范本投影片duplicate()
复制,并将复制的内容接上昨天所写的 rewriteWords
(参考资料:D20 - 如何用 Apps Script 自动化地创造与客制 Google Slides?(一)架构拆解与更改文字)好,如果复制一张投影片OK,那接下来就是怎麽样大量复制并调整了。
这边我们就要接起 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])
}
}
}
跑起来的影片长这样——
看来是有成功。
好,那我们一样一步步来解析——
pres
)、范本一(template_1
)和范本二(template_1
)row_data
)就会是 [A2, B2] , [A3, B3] .... 以此类推。所以要取得 Google 中 A 栏的数值的话,要用 row_data[0]
, B 栏要用 row_data[1]
。 这边不懂记得 D4、D4 还是提醒要看懂 D4。if
来分流说,如果 Google Sheet 中「系列」(A 栏)这一栏没有数值的话,套用范本一,不然就套用范本二。好,那这样就完成了快速复制我们全部的 Cover page 了!
好,那今天就到这边。今天我们主要学了:
其中第三点是有最多变化的可能,包含换图片、换表格、换背景颜色等...,但先用简单的文字让大家知道,其他的我们继续玩下去。
今天进入了 Slide 的第二天,希望对大家有所帮助。如果还有问题,透过留言之外,也可以到 Facebook Group,想开很久这次铁人赛才真的开起来,欢迎来当 Founding Member。如果不想错过可以订阅按赞小铃铛(?),也欢迎留言跟我说你还想知道什麽做法/主题。我们明天见。
>>: Day 06 : 操作基础篇 3 - 认识「主题」与 CSS 客制化设定
不管是数位还是手写,各有各种的好处,端看每个人的需求。来看数位及传统载体的优劣势:手写的最大好处是在...
续上篇,Day6 - 读 Concurrency is not Parallelism - Rob ...
盐水爱河 春天小栈 地点:盐水区西门路7-1号 时间:11:00~22:00 还记得当时会找到这一家...
JavaScript feature 随着越来越深入JavaScript,现在所考察和学习到的co...
作为一名 IT,和日志打交道是必不可少的,我们经常需要去查看一些日志文件,以从中获取一些有用的信息,...