iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0

選型比努力重要,那些早知道就好的事之一:早知道有Google Sheets API,我當初就不會選擇用GAS環境的doGet刻一個假的HTTP response物件。

前言

會想分享這則筆記,是因為個人在某個實作上,愚蠢地選擇了不適合的服務,儘管解決了需求,但繞了遠路、徒勞且浪費一堆時間。

今天要來聊與Google Sheets相關的幾種服務的差異,並補充一些個人主觀選型偏好。

正文

Google Sheets相關的功能或服務[^1],不論是內建或支援,我個人的心智地圖目前如下:

  1. 內建服務
  2. 進階服務
  3. Google Sheets API

內建服務

首先是內建服務,它是Google Workspace這套商業應用服務生態系所提供的low-code自動化方案的API入口。從規格上來看,就是昨天(Day03)提到的,掛在globalThis上的GAS環境特有的全域變數:

globalThis
├─ Google Workspace
│  ├─ SpreadsheetApp / DocumentApp / SlidesApp
│  ├─ FormApp / GmailApp / CalendarApp
│  └─ DriveApp

內建服務關於試算表操作的文法語順比較貼近VBA[^2],雖然功能沒有Google Sheets API強,但小型專案已經足夠使用,且不用跑繁複的GCP權限開通與IAM設定。

例如在VBA上的這句:

Range("A1").Value = Format(yesterday, "mm/dd")

在GAS上是相似的語順:

sheet.getRange("A1").setValue(formattedDate);

除此之外,如果需要客製化選單,讓使用者自行觸發函式,除了用HTML,那就只有內建服務的SpreadsheetApp可以產製原生GUI。

Google Sheets API

不同於內建服務,Google Sheets API就不屬於GAS環境,而是Google提供的另一套完整的REST API服務,語法風格就完全沒有VBA的色彩。

Google Sheets API現在被整合進GCP方案,不同於其他小型API,必須先跑完繁複的IAM流程後,才能開始使用。

優點是免費配額比內建服務更多,對於進階批次處理的效能更好,在複雜邏輯時的語法比GAS環境內建服務更簡潔。

進階服務

對以上兩者的定位有初步認識後,就比較好理解進階服務。進階服務其實就是GAS環境對於Google Sheets API的封裝,因此進階服務的版本有時候會落後於Google Sheets API的版本。

進階服務需要在GAS環境的雲端IDE額外開啟,才會被掛上globalThis。換言之,沒有開啟前,globalThis不存在進階服務,也就無法使用。雖然可以自行更改進階服務的別名,但實務上為了測試環境與正式環境能複用,通常不會更改,除非會同時用到舊版與新版API才有需要更改以做區分。

其實每個GAS專案都有綁一個開發者無法自行做細部設定的GCP專案,當開發者在雲端編輯器開啟進階服務時,GAS環境就會自動做好預設的權限配置。[^3]

後話

接著來聊聊我的主觀偏好。

僅就我個人的前端與VBA經驗來評估,我覺得如果是VBA專案要上雲,那用內建服務會最有效率,不用跑IAM流程,直接用GenAI轉換或Google官方的轉換器。又或是當下的狀態比較熟悉VBA的語感,不會做太複雜的操作,那就用內建服務就好,等遇到瓶頸再轉進階服務。

如果熟悉JavaScript或Python(玩資料庫的大大因為各種業務現場的無奈轉回用Google Sheets?),那就直接開進階服務,功能更完整。可是它有一個缺點,就是會同時吃GAS專案和GCP專案兩邊的配額。

如果需要從外部環境與GAS環境互動時,就必須去開通Google Sheets API。當然,理想上如果有足夠的時間去做前期權限設定,直接用API更好。不過,我依然覺得GAS專案通常是用來處理小型自動化,如果要走到這步,建議也將GAS環境以外的解決方案一併評估。

關於GUI,可以自行選型要用HTML還是內建服務的原生GUI,這部分就不是Google Sheets API可以處理的。我目前實務上對於GUI的實作分成兩種:SpreadsheetApp的客製化選單,使用者體驗一致;或就用瀏覽器環境,prebuild時依賴csv檔或Google Sheets API。[^4]

Reference

[^1]: https://developers.google.com/apps-script/guides/services

[^2]: 當然,只是試算表相關物件看似相同,有很多細節兩者都不同甚至相反。後面幾天如果有回顧到VBA專案的話,可能再來聊聊。

[^3]: 之後也可以自行綁另一個完全自定義的GCP專案。

[^4]: 還有一個方式是,在GAS專案環境部署HTML,我沒有實作過,可以參考Winnieさん於2024年鐵人賽圖文並茂的範例。


上一篇
Day03|globalThis標準與GAS的全域物件
下一篇
Day05|GAS的保留函式
系列文
我只是不想加班:一名客服人員的GAS自救之路6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言