當年寫VBA時,為了方便複製貼上,將所有Sub都擠在同一份超大型
.bas
文件…… 所幸寫GAS專案時,有官方維護的開源工具clasp,幫我省下不少重複作業的心累。
前面幾天淺談了GAS環境與其相關的服務,接下來幾天則想分享我個人實務上偏好的開發工具配置。
如第一天(Day01)所提到的,會預設讀者已有開發經驗,偏向分享心得而非教學,所以此系列文章將以本地開發為主。
那麼,如果是完全沒有程式開發經驗、還沒有使用過任何開發工具的同學,我推薦可以參考森林裡的園藝眼鏡さん於2021年鐵人賽的系列文章[^1],他介紹了直接使用雲端IDE為主的開發方式,可以不用做任何配置便立刻開始實作。
今天要來推薦我個人寫GAS專案必定會使用的、由Google官方維護的開源工具:clasp[^2],它讓我們也可以在本地使用我們習慣的、偏好的工具鏈來開發。
Clasp這個運行於Node.js的開源CLI,它的全名是Command Line Apps Script Projects,我很喜歡clasp這個縮寫是扣環的具體形象。Clasp這個工具讓開發者可以非常方便地將程式碼推送至測試用或正式版的GAS環境,而不用手動來回複製貼上。
在前幾天(Day02)有提到,GAS環境上的副檔名是.gs
,而當我們使用clasp幫我們push檔案到GAS環境時,clasp會先幫我們把.js
文檔做轉換後,才推送到GAS環境,這時GAS環境就會顯示.gs
副檔名。
可能會有讀者跟我一樣好奇,GAS環境如何實作檔名的轉換、會動到我的程式碼嗎?其實意外地挺符合直覺:push或pull時,程式文檔在傳輸過程都會先被轉成json檔。Clasp幫我們封裝了Apps Script API[^3],當clasp推送文檔時,會先把文檔轉換成File
格式的json檔:[^4]
{
"name": string,
"type": enum (FileType),
"source": string,
"lastModifyUser": {
object (User)
},
"createTime": string,
"updateTime": string,
"functionSet": {
object (FunctionSet)
}
}
此時文檔內容會被封裝進source
,並依副檔名,填入對應的屬於GAS環境格式的檔案類型type
,分別有SERVER_JS
[^5]、HTML
與JSON
。換言之,clasp不會幫我們對.js
或.ts
文檔的程式碼做任何編譯,就僅僅只是自動判讀並標上檔案類型。
如此一來,clasp可以讓我們在本地用Node.js環境直接用.js
(甚至是.ts
)進行開發,相容於Git與其它工具鏈。讓我們可以利用更多現代的開發工具,配置屬於各自的開發偏好的.vscode/settings.json
、.krio/steering
、GEMINI.md
等等。
推薦給想在本地做配置的開發者們使用看看,明天接著讓我分享個人偏好的配置步驟與設定文檔。
週六晚上,讓我稍微碎碎唸個人的開發歷程。
過去一年來除非是超小型一次性腳本,我幾乎每次建立新的GAS專案時都必定會使用clasp,現在回顧起來,顯然我非常排斥在瀏覽器上寫code😅
這裡也想跟VBA做個比較,由於當年VBA一直被我視為過渡期,公司電腦當時也因為各種權限設定不方便做額外配置,所以為了方便複製貼上,我的.bas
文件只好將所有Sub(類似JavaScript的function)都擠在同一份超大型文件,沒有辦法像GAS專案一樣至少拆分出2、3個文檔,這在後期修改與維護上非常厭世🙃
[^1]: 摘引:「這系列文章定位給入門者,大部分人可能沒有熟悉的 IDE 與特定語言。也因為我們只開發簡單功能,這系列我們會以每個人都能使用的『線上開發』做為主要的講解方式。」
[^3]: https://stackoverflow.com/a/75366101
[^4]: https://developers.google.com/apps-script/api/reference/rest/v1/File
[^5]: 這裡的SERVER_JS
是「An Apps Script server-side code file」,看到時我覺得挺有趣的,因為過去對於「server-side」的語用通常是指涉Node.js,果然client/server是一個相對的概念。