D2- Google Apps Script (GAS) 的环境设定、专案结构(Trigger)与四种打包方式

那进入到第二天的,今天我们先来了解基本 Google Apps Script 的设定方式!

ㄧ、怎麽开始使用 Google Apps Script?

进入方式 1. 从网址进入整体专案总览

进到 Google Apps Script 的官方网站後,直接点击 start scripting

进入方式 2. 从 Google Workspace 的产品们直接进入

到任意的 Google Workspace ,透过工具 > 指令编辑器来进入有绑定的 GAS 专案。

这两个方式的差异在於,在於前者本身并未绑定任何 Google 产品,而後者通常都是会有个绑定的表单、投影片或文件,所以有些功能使用上会有一点点差异。像是在还没包装成 Add-On 时,两者在抓要让 GAS 读特定 Google Sheet 时,方式 2 可以透过 getactivespreadsheet() 抓出「有绑定使用的表单」,方式 1 则须透过完整指定 ID 来抓到档案。

通常开发时,我习惯透过 方式2 ,可以省掉一些设定的时间。


二、一个 GAS 专案的结构

总共有五个部分,包括总览(Overview)、编辑器(Editor)、触发条件(Trigger)、执行项目(Execution)和专案设定(Setting),其中比较重要的 「触发条件」 和 「执行项目」,我们之後开发时主要会看到这两个。

结构 1 编辑器(Editor)

通常打开一个新专案并进入编辑器,会看到一个预设的 程序码.gs,档案类型 .gs 是 GAS 的档案结构,在下一个段落会详细说明。在这边,为了方便待会的说明,我们直接在 程序码.gs 中写一段简单的 Code。

以下这段是我透过进入方式2绑定一个功能表後,用 SpreadsheetApp 叫出能控制 Google Sheet 的 Object API,再透过 getActiveSpreadsheet() 跟它说给我现在有「绑定的表单」,也就是我影片中左边那份,并用 toast 丢出一个小告示说「Hello World!」,我们透过按下「执行」来让这段程序码运行。

function hello() {
  SpreadsheetApp.getActiveSpreadsheet().toast("Hello World!");
}

结构 2 执行项目(Execution)

结构 1 我们展示了顺利执行的话会长怎麽样,但如果我们想知道,执行背後的 console,或执行失败的原因呢?这个时候就可以透过我们的 执行项目 来看到。

执行项目中,会显示出所有你所有按下「执行」的历史。包括是...

  • 在哪一个版本的「部署」中被触发:我们之後会提到,可以将 GAS 发布成 Web App
  • 被触发的是什麽「函式」:这边就会是 hello
  • 执行的触发「类型」:是有人点了选单,还是在後台执行
  • 执行的「开始时间」
  • 执行的「持续时间」
  • 执行的「状态」,有三种比较常见:「已完成」、「已逾时」、「失败」

「持续时间」记得没有额外付费的话,执行有个扣打不能超过六分钟,可以参考第一篇文章。

点击每个执行项目,都会显示其过程中的 console,如果是错误会显示错误原因。如果想要看到成功的执行过程,则可以透过 Logger.log() 来印出过程中的物件、变数等,在下面第四点会详细说明。

结构 3 触发条件(Trigger)

在 GAS 中,我们可以设定「何时要启动这函式」,常见的有「每次有人开启表单/档案」时启动,「每天早上8点刷一次」,「跟着特定行事历,到 9/1 凌晨 12 点时」帮我开一下。

实际上怎麽设定呢?一样,我们打开绑定好表单的 GAS,并先完成想排定时间的程序码(像这边是 hello),并选择三种驱动方式。

  • 试算表:或是其他的 Google 产品
  • 时间驱动:你要在每小时、每分钟、每日、每周还是每月触发一次
  • 来自日历:要选择跟着哪个行事历(Google Calendar)

要注意的是,如果是在後台直接执行、运用打包後的选单或按钮,抑或是在 Google Sheet 中已「公式」的形式使用,其触发的 GAS 程序会在执行项目中列出,但不会列在触发条件当中。


三、GAS 可接受的档案类型

基本上 GAS 上你可以用这几个档案:.html.css.js.gs,且要注意是很纯的 css,像是 .scss.sass 以及其他如 .php.py 等目前是仍无法读取。而其中比较特殊的档案是 .gs 在写 GAS 时有个特别的档案类型,供 GAS 运行使用。

要注意的是,这边指的是单纯 GAS 接受的档案类型。如果你是有一个已经完成的 GAS 服务,想要串接 API,则可以透过 Google Worksapce REST API 来完成,其支援大部分的後端语言,包括 Go、Java、NodeJS、Python、Ruby 与 PHP,也支援 Android 和 IOS 要串接手机的 Code 也没问题。


四、开始写扣

1. 线上开发 vs 本地开发

想要开发 GAS ,可以直接用最开始的叙述直接进入 Apps Script 的平台,以类似 Cloud IDE 的方式开发与测试。至於要本地开发的话,则通常会使用 clasp 这项工具(Github: clasp)。这系列文章定位给入门者,大部分人可能没有熟悉的 IDE 与特定语言。也因为我们只开发简单功能,这系列我们会以每个人都能使用的「线上开发」做为主要的讲解方式。

2. 第一次使用:允许授权(Create Credentials

在任何 GAS 专案的最一开始,当你按下第一次「执行」时,有个比较麻烦的步骤要按下「允许授权」,且要按下接受「不安全」的按键才会让你继续使用。

3. 如何 Debug

在 GAS 中,我们主要有两种 debug 的方式。第一种是透过 Logger.log,类似 JS 中的 console.log() ,另一种则是用期线上开发的云端 debug 工具,会告诉你跑到这一行有哪些变数(跟线下的 IDE 很像)。


五、打包让他人可以使用

打包 1. 制作成按钮

功能完成後,接着则按 插入 > 插图,然後对做出来的图案(任意图案)按下右键,有一个指派程序码(Assign),再打上 function 的纯名字(输入 hello 而不是 hello())就可以完成设定了!

取消的话,一样是对按钮按右键,则可以将指派的程序码删除。

打包 2. 用成类似 Add-On 的有 UI 选单

在这边,我们先坐两个简单的功能,分别是「显示出 Hello」和「显示出 Hi」。

function hello() {
  SpreadsheetApp.getActiveSpreadsheet().toast("Hello World!");
}

function hi() {
  SpreadsheetApp.getActiveSpreadsheet().toast("Hi!");
}

然後我们再用 onOpen() 这个後台的触发条件,意思是每当开启表单时,就执行这段程序码。接着再透过 SpreadsheetApp.getUi() 呼叫 UI,并透过 createMenuaddSubMenuaddItem 做出另外一个选单画面。 特别提一下 addItem 的做法是... addItem( 表单上显示的项目名称, 实际在 .gs 档案中的程序名称)

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('客制化工具列')
      .addSubMenu(ui.createMenu('打招呼')
          .addItem('Say Hi', 'hi')
          .addItem('Say Hello', 'hello'))
      .addToUi();
}

最後完成就会像这样子!

打包 3. 用成 Web App

打包 4. 包装成 Google Sheet 可以用的公式

这两个打包之後用完整的两篇来介绍给大家。

而实际使用上,会建议用 打包2,原因是用 打包1 的按钮功能很阳春,按下去时并不会知道自己已经点到了,有时会误触很多下。

补充:怎麽调整 Google 系列产品的时间

在开发 GAS 时,你会发现「时区设定」很重要,因为会想知道是几点出 bug 的,以及排程的触发条件是不是跟着自己的时区。那要怎麽调整呢?基本上是「绑定的试算表」(或其他产品) > 档案 > 试算表设定 > 时区 来做更改)


这是第二天,把开发初期要注意的是尽力写上来,主要透过影片的方式,希望能帮助大家时间,希望有所帮助!也欢迎留言跟我说想看到什麽样的题目喔!


<<:  Day 1:Native vs. Not-so-native

>>:  Day 2-什麽是单元测试及何谓优秀的单元测试? (基础-1)

Day3 - 登入登出相关问题

在安装完Shioaji套件之後,我们就可以开始使用api的功能了。 第一步当然是要登入我们的帐户啦,...

day8 kotlin coroutine的 runBlocking, withContext

runBlocking 中文用户如我们? 直译一下就是,跑一个塞住 恩,三小? 他真正的意思是,执行...

Day30 完赛心得

连续30天的铁人赛终於要完结啦! 这次参赛主题"Elastic Stack(ELK)数据图...

Python Flask 架站笔记 第2天 读取资料 网页框架 与爬虫

第二天的课程对於没有写过网页的我有一点难度,主要是网页的架构不像数据直线的思考,整个架构颇立体的, ...

Day 27 - 临时插播的中间件 - Middleware

中间件 - Middleware 嗨大家好,因为在部署 Elastic Beanstalk 上遇到了...