2021-08-20

Google Sheet API v3 升 v4

之前用這個網址格式取得 JSON 格式 Google Sheet 資料,一直相安無事:

https://spreadsheets.google.com/feeds/list/SHEET_ID/TAB_INDEX/public/values?alt=json

然後大概從 2021/8/15 開始,就有機率讀取不成功(對,有時候會成功 🙈),有的時候是炸 CORS 問題、有的時候是炸 404。

狗了一下的結果,應該就是 Google Sheet API v3 在 2021/8/2 停用所導致的。至於 v3 版跟應該還會繼續活著的 GData 有什麼關係、為什麼是「有機率掛掉」就… 不研究… [蓋牌][翻白眼]

經過幾天的摸索,如果只是單純要取得 JSON,那麼會遇到下面這幾件事情。

首先要去 Google Cloud Platform 搞一個 API 金鑰(以下簡稱 API_KEY)。如果之前沒有用過可能還要先開一個(看起來毫無意義的)專案然後才能產生… 😱

有了 API 金鑰之後,接下來是把網址改成這個格式:

https://sheets.googleapis.com/v4/spreadsheets/SHEET_ID/values/RANGE&key=API_KEY

這邊不再是用「第幾個工作表」(或是那個根本不知道怎麼來的 id 值)的方式,而是指定 RANGE。完整版的 RANGE 大概是「FOO!A1:D100」的長相,這表示要求「FOO」這個工作表的 A1~D100 這個 cell 範圍的資料。

實測之後(找不到文件… 🙈)發現允許下列幾種變形:

  • FOO:可以省略 cell 範圍。如此會回傳整個 FOO 的資料
  • A1:D100:可以省略工作表名稱。如此會回傳第一個工作表的指定 cell 範圍的資料

回傳的 JSON 也跟以前不一樣,v4 版變得很純:

{
  "range": "'FOO'!A1:D100",
  "majorDimension": "ROWS",
  "values": [
    ["ColumnA", "欄位B", "ColumnC", "欄位D"],
    ["第一筆A", "第一筆B", "第一筆C", "第一筆D"],
    [],
    ["", "第三筆B"]
}
  • v3 會把 sheet 的第一個 row 的值當成 JSON 的 key 值;v4 純粹就是給你一個二維字串陣列。(反正都能指定範圍了)
  • v3 遇到第一個空白 row 就會視為後面沒有資料停止輸出;v4 會在指定範圍內確定是否以下空白才停止輸出,其中夾雜的空白行會給一個空陣列。
  • 如果該 row 第 n 個 column 之後都沒有值,則該 row 對應的陣列長度只到 n - 1。1~n - 1 當中如果有 column 沒有值,會給空字串。

一樣是實測結果(還是找不到文件… 🙈),下列狀況會導致 server 給不是 200 的 HTTP status code:

  • 400:range 無法正常解析
  • 403:API_KEY 值不正確
  • 404:SHEET_ID 值不正確

最後,用 v4 版,sheet 可以不用做「發布到網路」這一個動作。