Google Apps Script学习记录

第一次听说 GAS（Google Apps Script）是在入职现在公司实习岗位的时候。前辈让我接手一个公司内部用的小工具的后续开发。那个工具就是用 GAS 写的。依托于 Google 本家，它无缝和 G 家的各类工具集成，开放的 API 也非常全面而好用（当然你也可以在其他语言中调用谷歌的 API，只不过 GAS 是无缝集成的所以体验最好罢了）。印象最深刻的是它对于 Google Spreadsheet 和 Google Calendar 的支持。我在空闲时间用 GAS 给研究室放在 Spreadsheet 上的日程表写了一个自动导入 Calendar 的功能。基本上完全就是无脑套官方给的接口，敲代码丝滑无比到令人感动。如果你平时总是被各种奇葩文档折磨，请务必体验一下 GAS。可能作为一门脚本语言（或者说平台），它也有复杂的一面，但是当只是想用它做一个简单的 G 家服务的自动化和协同的时候，它在刚入门的时候就能提供非常美好的体验。

关于本地化与版本控制

GAS 提供了云端的编辑器，同时也支持简单的版本控制。但是对于用习惯了 Git 和 Github 的人而言，本地化可能是个更好的选择。Google 的开发者们为此提供了一个很棒的开源工具：Clasp

安装 Clasp

Clasp 被封装为一个 Package，如果你本地安装了 npm，那么你只需要运行：

Copy
npm install -g @google/clasp

如果本地没有安装 npm, 我的建议是安装一个，我们可以从这里跳转到 Node.js 的下载界面。他们提供多平台的支持，另友情提醒请不要盲目追更新版本，LTS 版本是更稳妥的选择（没有人会愿意看到每次运行程序的时候都会弹出几行鲜红的警告）。

在我们开始用 clasp 构建我们的脚本和应用之前，还需要完成一件要紧的事情。那就是登录我们的谷歌账号。不然谷歌会拒绝我们和没有连接权限的云端进行交互。我们可以运行以下命令：

Copy
clasp login

这会打开本地默认的浏览器，要求我们登录谷歌账号。我们需要登陆那个想要在上面部署应用或者脚本的账号。

当然，如果你不信任你的电脑所处的环境，在每一次离开的时候，你可以选择登出，这也只需要简单的一行命令：

Copy
clasp logout

好了，到这里我们就完成了准备工作，可以开始用 clasp 在本地部署我们的项目了。

在本地部署项目

利用 Clasp，我们可以很容易的在本地创建一个新项目:

Copy
clasp create

这会在当前工作目录创建一个默认的新项目。当然它也提供了一些更丰富的选项，我们可以用--title "My Script"来指定项目的名称， 也可以用--type指定这个项目的类型。当然通过--rootDir选项，我们也可以指定新项目存放的位置。另外有一个和 G 家的服务息息相关的选项--parentId "1D_Gxyv*****************************NXO7o"，这可以让我们把项目绑定到某一个特定的服务，比如说某个 Google SpreadSheet。对了，这里的 ID 我们可以在对应服务的网址上找到：docs.google.com/presentation/d/{id}/edit

当然更多的情况下，我们往往是针对某一个已经存在的服务去编写项目，这时候clasp clone命令就很有用。我们可以直接用对应服务的网址来把对应的脚本项目复制到本地：

Copy
clasp clone "https://script.google.com/d/15ImUCpyi1Jsd8yF8Z6wey_7cw793CymWTLxOqwMka3P1CzE5hQun6qiC/edit"

到这里，我们已经成功在本地部署了项目，当我们想要发布到云端或者从云端拉取的时候，我们可以使用clasp pull和clasp push命令，请务必注意这两个命令和 Git 的根本不是同一回事，它们只会单纯的覆盖掉原先的内容。友善的建议是，避免使用clasp pull，并且只在必要的时候使用clasp push。当然，clasp 的开发团队比较细心，使用clasp pull的时候，他们通常不会直接覆盖掉我们本地的文件，当 clasp 检测到本地存在同名文件的时候，它会结束进程并且提醒我们这一点。

使用 Git 来对本地的 GAS 项目进行管理

我们指望不上 GAS 自己在云端内置的版本管理系统，它只提供了有限次数的版本，并且各类操作也没有 Git 那么完善。所以我们下一步的目标就是使用 Git 和 Github 来对本地的项目进行管理。其实无非就是在本地新初始化一个 Git 仓库而已。

我们把工作目录跳转到对应项目内。然后初始化一个 Git 仓库：

Copy
git init

如果只是想要在本地进行版本管理，那么到这里就可以照常使用 git 了。但是如果还想要上传到 Github 等云端仓库，那么我们还需要多几步。

首先我们需要编写.gitignore 文件，来让 Git 忽略掉一些只需要保留在本地，而且也不希望 Git 去管理的文件。如果我们查看 clasp 在本地给我们创建的项目，我们就会发现有一个隐藏的.clasp.json 文件，里面记录了我们的 script id 和 parent id，用于 clasp 定位云端上的相关文件。显然这是不需要 Git 去管理的。所以我们可以在.gitignore 里面忽略掉它。

Copy
touch .gitignore
echo ".clasp.json" > .gitignore

当然，你也可以用编辑器（比如 vscode）打开文档编辑后保存。

接下来我们就可以正常执行git add等命令了。

Copy
git add --all
git commit -m "init"

最后，你可以在 Github 上创建一个新仓库，并将本地的仓库推送上去。

未完待续