← 逆流而上
Wudelay

n8n 串接 Google Sheets:自動寫入資料完整設定

Wudelay AI 2026-09-27約 13 分鐘的航程

n8n 串接 Google Sheets:自動寫入資料完整設定

n8n 串接 Google Sheets,核心就是「Google Sheets 節點」加上一組授權憑證:先讓 n8n 取得存取試算表的權限,再把工作流程裡的資料(表單提交、爬取結果、其他 API 回傳)依欄位對應規則寫進指定的分頁與範圍。整個設定分成三層:授權方式的選擇(OAuth2 或服務帳號)、節點操作的選擇(新增、更新,還是兩者合一)、以及欄位怎麼對應到試算表的欄。三層中任何一層設定錯,都會表現成「明明流程跑完卻沒寫進去」或「寫錯欄位」這類問題。

這篇文章按照實際設定的順序走一遍:先處理授權,再處理節點操作邏輯,接著處理欄位對應,最後用兩個常見情境(表單資料、爬取資料)把整條流程串起來,並整理官方文件列出的常見錯誤與 Google Sheets API 本身的速率限制。

n8n 串接 Google Sheets 的兩種授權方式:OAuth2 vs 服務帳號

n8n 官方文件把 Google 系列的認證方式分成幾種,實務上會用到的是 OAuth2 與服務帳號(Service Account)兩種,官方建議「OAuth2 因為更普及、設定也更簡單」作為預設選擇,服務帳號則保留給有特定需求的情境,詳見 n8n 官方文件的 Google 認證總覽。

方式一:OAuth2(需要人工登入授權)

OAuth2 又分兩種路徑,差別在於要不要自己建立 Google Cloud 專案:

  • Managed OAuth2:只在 n8n Cloud 上提供,官方文件說明是「直接在 n8n 上用 Google 帳號登入,不需要在 Google Cloud Console 做任何設定」,支援 Gmail、Google Sheets、Google Drive 等特定節點。
  • Custom OAuth2:自架(self-hosted)n8n 一定要走這條路,需要自己在 Google Cloud Console 建立 OAuth 應用程式再接回 n8n。

Custom OAuth2 的設定步驟,依照 n8n 官方 OAuth2 設定文件整理如下:

  1. 在 Google Cloud Console 建立一個新專案。
  2. 到「APIs & Services > Library」啟用需要的 API。官方文件特別提醒:「Google Docs、Sheets、Slides 除了各自的 API 之外,都還需要額外啟用 Google Drive API」,只開 Google Sheets API 會導致選取試算表清單時抓不到檔案。
  3. 設定 OAuth consent screen:填入應用程式名稱、支援信箱、使用者類型(Internal 或 External)、聯絡信箱,並加入 authorized domain(n8n Cloud 用 n8n.cloud,自架則填自己的網域)。
  4. 在「Credentials」建立 OAuth client ID,應用程式類型選「Web application」。
  5. 把 n8n 憑證頁面上顯示的 OAuth Redirect URL,貼回 Google 那邊的「Authorized redirect URIs」欄位並儲存。自架環境常見格式類似 http://localhost:5678/rest/oauth2-credential/callback。
  6. 回到 n8n,把 Client ID、Client Secret 貼進憑證欄位,按下「Sign in with Google」完成授權。

官方文件也列出幾個常見錯誤:

錯誤 原因與處理
redirect_uri_mismatch Google 端登記的 redirect URI 要跟 n8n 顯示的網址完全一致,連通訊協定與 port 都要對上。
invalid_client Client ID 或 Client Secret 貼錯,常見是複製時多帶了前後空白。
Testing 模式 7 天過期 OAuth consent screen 使用者類型選 External 且未送審時,預設是 Testing 模式,只有手動加入的測試帳號能完成授權,且憑證 7 天後就要重新登入一次。

方式二:服務帳號(Service Account,適合全自動、無人值守)

服務帳號不用人工登入,適合排程觸發、伺服器對伺服器這類「沒有人在旁邊按同意」的場景。依照 n8n 官方服務帳號設定文件,步驟是:

  1. 在 Google Cloud Console 建立專案並啟用對應 API(同樣要記得 Google Sheets 需要一併啟用 Google Drive API)。
  2. 到「APIs & Services > Credentials」選擇「Create credentials > Service account」建立服務帳號。
  3. 在服務帳號的「Keys」頁籤選「Add key > Create new key」,格式選 JSON 並下載金鑰檔。
  4. 打開下載的 JSON 檔,把 client_email 貼進 n8n 憑證的 Service Account Email 欄位,把 private_key(去掉頭尾的引號)貼進 Private Key 欄位。

服務帳號有一個容易漏掉的地方:它是一個獨立的 Google 帳號身分,必須把目標試算表另外分享(共用)給這個服務帳號的 email,否則節點會回報沒有權限存取。如果要讓服務帳號代表 Workspace 內某個真人操作,官方文件也提供「Impersonate a User」選項,但需要網域管理員先開啟 domain-wide delegation。

該選哪一種?

情境 建議選擇
個人或小團隊,用 n8n Cloud Managed OAuth2,幾乎零設定
自架 n8n,一般自動化 Custom OAuth2
全自動排程、不想每 7 天重新登入 服務帳號
需要以特定使用者身分寫入 Workspace 共用試算表 服務帳號 + Impersonate a User

Google Sheets 節點的操作怎麼選:Append、Update、Append or Update

授權完成後,Google Sheets 節點在「Sheet Within Document」資源底下提供多個操作,官方 Sheet Within Document operations 文件列出以下幾種,是這次要串接 n8n Google Sheets 自動寫入資料時最常用到的部分:

操作 用途
Append Row 只在資料末端新增列,不檢查是否已有相同資料。
Update Row 只更新既有列,官方文件明確寫「若需要在無匹配項時自動新增,請改用 Append or Update Row」,也就是說 Update Row 找不到對象時不會新增。
Append or Update Row 先比對「Column to Match On」指定的欄位,有找到就更新該列,沒找到就新增一列,等同一般說的 upsert。
Get Row(s) 依欄位與值篩選讀取列。若篩選條件符合多列,預設只回傳第一筆,要拿到全部符合的列需另外開啟「Return All Matches」。
Clear 清空整表、指定列、指定欄或指定範圍的內容,但不刪除工作表本身。
Delete Rows or Columns 指定起始列/欄與數量,刪除工作表內的列或欄。
Create/Delete(工作表層級) 新增或刪除整張工作表。

要做「自動寫入資料」這種需求,實務上幾乎都在 Append Row 和 Append or Update Row 之間選:純粹記錄型的資料(例如表單提交紀錄、log)用 Append Row 即可;如果同一筆資料可能重複進來、需要判斷「已存在就更新、不存在才新增」(例如用 email 或訂單編號當唯一鍵),就要用 Append or Update Row。

Append 相關操作還有一個「Use Append」選項,會改用 Google Sheets API 的原生 append 端點。官方文件的說明是這個選項「可能帶來更好的效能」,但如果既有資料中間有空白列或資料不連續,n8n 可能會把新資料插到非預期的位置,資料量大、追求寫入速度時可以評估開啟,但要先確認工作表本身沒有跳列的情況。

欄位對應:Mapping Column Mode 與 Column to Match On

節點操作決定「做什麼」,欄位對應決定「資料填進哪一欄」,這一步最容易出錯,也是官方 Google Sheets 節點常見問題文件裡點名的重災區。

Mapping Column Mode 的兩個選項

  • Map Automatically:n8n 會自動尋找跟 Google Sheets 欄位標題(header)相符的輸入資料欄位。用這個模式,前提是輸入資料的欄位名稱要跟試算表的欄標題一致;官方文件對這個模式的說明是「確保輸入資料的欄位跟 Google Sheets 的欄位一致」,遇到欄位名稱對不上的情況,可以先在 Google Sheets 節點前面加一個 Set/Edit Fields 節點,把欄位名稱改成跟試算表一致。遇到輸入資料裡有試算表沒有的多餘欄位時,Map Automatically 底下還可以設定處理方式:「Insert in New Column(s)」(預設,直接新增欄)、「Ignore Them」(忽略多餘資料)、「Error」(丟出錯誤中止流程)。
  • Map Each Column Manually:逐一欄位手動指定要填入的值,資料結構複雜、欄位名稱對不齊,或想在寫入前用表達式加工資料時,用這個模式比較保險。

Column to Match On:Append or Update 的比對邏輯

使用 Append or Update Row 時,一定要指定「Column to Match On」,這個欄位定義了 n8n 判斷「這是新資料還是舊資料」的依據:n8n 會拿輸入資料在這一欄的值,去試算表對應欄位裡找有沒有相同的值,找到就更新那一列,找不到就在末端新增一列。實務上這一欄要選「不會變動、具唯一性」的鍵,例如 email、訂單編號、網址,而不是姓名這種可能重複或會被修改的欄位。

Data Location:Header Row 與 First Data Row

Append、Update、Append or Update、Get Row(s) 這幾個操作都有「Data Location on Sheet」的進階選項,可以指定「Header Row」(欄位標題所在的列號)跟「First Data Row」(實際資料開始的列號)。工作表如果不是第一列就是標題、或標題上方還有其他說明列,就要在這裡明確設定,否則 n8n 預設把第一列當標題,讀取列資料時不會回傳標題列本身。

情境一:把表單資料自動寫進 Google Sheets

最常見的 n8n Google Sheets 應用之一,是把表單提交結果即時寫進試算表,取代人工複製貼上。基本流程:

  1. Form Trigger 節點當觸發點。依 n8n Form Trigger 官方文件,這個節點會直接產生一個表單頁面,使用者填寫並送出後就觸發工作流程;它同時提供 Test URL 與 Production URL 兩組網址,也可以在 Node options 關閉「Include User in Output」,避免把使用者帳號資訊一併寫進試算表。
  2. 在 Form Trigger 裡把要蒐集的欄位(文字、下拉選單、日期等)建好,欄位名稱建議直接對齊 Google Sheets 的欄標題,後面接 Google Sheets 節點時可以直接用 Map Automatically,不用再手動兜欄位。
  3. 接上 Google Sheets 節點,操作選 Append Row(單純記錄每一筆提交)或 Append or Update Row(例如同一個 email 重複填寫時要更新而不是產生新的一列,Column to Match On 設成 email)。

如果資料來源不是 n8n 自己產生的表單,而是外部服務(例如網站上的第三方表單、Typeform 這類工具)用 webhook 通知 n8n,架構上就是把 Form Trigger 換成 Webhook 節點,接收流程可以參考 n8n webhook 教學:用網址觸發你的自動化流程,後面接 Google Sheets 節點的邏輯完全一樣。

情境二:把爬取的資料寫進 Google Sheets

另一種常見需求是定期爬取網頁資料(價格、清單、公告)並累積到試算表。基本流程:

  1. Schedule Trigger:定時觸發,例如每天早上跑一次。
  2. HTTP Request 節點:對目標網址發出請求,取得原始 HTML。
  3. HTML 節點:依 n8n HTML 節點官方文件,這個節點提供「Extract HTML Content」操作,用 CSS selector 從整段 HTML 裡取出需要的文字、屬性值或連結,取代舊版的 HTML Extract 節點。
  4. 如果抽取結果是陣列(例如一次抓到一整頁的多筆項目),先用 Split Out 節點把陣列拆成多筆獨立資料,官方常見問題文件也建議陣列資料要先轉成一般的鍵值格式,才能正確寫進 Google Sheets 節點,可以用 Split Out、AI Transform 或 Code 節點處理。
  5. Google Sheets 節點:操作多半用 Append or Update Row,Column to Match On 設成該筆資料的唯一鍵(例如商品網址),避免每次重新爬都把同一筆資料再寫一次、造成重複列。

爬取類流程要特別注意目標網站的服務條款與 robots 設定是否允許自動化存取,這篇不深入討論爬蟲合規的部分,只涵蓋抓到資料之後怎麼寫進 Google Sheets 的節點設定。

常見錯誤與 Google Sheets API 速率限制

n8n Google Sheets 節點常見問題文件目前明確列出的兩個錯誤情境:

情況 原因 處理方式
陣列資料寫不進去 輸入資料裡有陣列型別的欄位,不符合 Google Sheets 儲存格要求的鍵值格式 用 Split Out、AI Transform 或 Code 節點先把陣列轉成鍵值對
「Column names were updated after the node’s setup」 試算表的欄位標題在節點設定完成後被改過,節點記住的還是舊欄名 重新選擇一次 Mapping Column Mode,讓節點重新抓取現在的欄位標題

除了節點本身的錯誤,寫入量大時還會撞到 Google Sheets API 原生的配額限制。根據 Google 官方 Sheets API 使用限制文件,讀取與寫入請求各自有獨立的每分鐘配額,數字同樣是每個使用者 60 次、每個專案 300 次:

Google Sheets API 讀取/寫入請求的每分鐘配額上限,服務帳號等單一使用者身分容易先撞到 60 次/分鐘的門檻。
Google Sheets API 讀取/寫入請求的每分鐘配額上限,服務帳號等單一使用者身分容易先撞到 60 次/分鐘的門檻。

也就是說,如果用服務帳號當唯一的存取身分,所有經由這個服務帳號發出的寫入請求都算在同一個「每個使用者」的寫入額度裡,60 次/分鐘很容易在批次寫入大量列、或多個工作流程共用同一組憑證時被打滿;讀取操作(例如 Get Row(s))則計入另一組獨立的讀取額度,兩者不會互相排擠、也不會互相消耗。超過額度會收到 429: Too many requests 錯誤,官方文件說明配額是「每分鐘重新計算」,等下一分鐘即可繼續發送請求。實務上遇到大量資料要寫入,可以考慮:把多筆資料合併成一次批次寫入,而不是一列一列個別呼叫節點;或是在流程中加入 Wait 節點,把寫入請求的速率壓在額度以內。

常見問題 FAQ

n8n Cloud 一定要在 Google Cloud Console 建立 OAuth 應用嗎?

不一定。n8n Cloud 提供 Managed OAuth2,可以直接在 n8n 介面用 Google 帳號登入完成授權,不需要另外開 Google Cloud 專案;只有自架 n8n,或是 n8n Cloud 上没有納入 Managed OAuth2 範圍的節點,才需要走 Custom OAuth2 的完整設定流程。

OAuth2 授權多久會過期?

如果 Google Cloud 專案的 OAuth consent screen 使用者類型是 External 且還沒送審(預設的 Testing 模式),只有手動加入的測試帳號能完成登入,且憑證大約 7 天就需要重新授權一次。長期自動化排程如果不想每週手動重新登入,可以評估改用服務帳號,或是把 OAuth 應用送審發布成正式版本。

一次寫入很多列會不會被 Google 擋下來?

會。Google Sheets API 對每個專案跟每個使用者都有各自的每分鐘請求上限,短時間內大量、密集地呼叫寫入操作就可能收到 429 錯誤。作法上盡量把資料整理成一次性的批次寫入,或用 Wait 節點把請求間隔拉開。

表單或爬蟲資料裡有陣列欄位,寫入 Google Sheets 一直失敗怎麼辦?

Google Sheets 的儲存格只能放單一值,不能直接塞一個陣列進去。遇到這種情況,要先用 Split Out 節點把陣列拆成多筆資料,或用 Code/AI Transform 節點把陣列轉成字串或鍵值對,再接到 Google Sheets 節點。

n8n 跟 Make 比,串 Google Sheets 哪一個比較適合?

兩者都有現成的 Google Sheets 模組/節點,差異主要在計價模式、節點邏輯的寫法習慣,以及自架與否的彈性,詳細比較可以參考 n8n 和 Make 差在哪?自動化工具比較。

參考資料

  1. Google | Nodes | n8n Docs(n8n Docs)
  2. Google OAuth2 single service | Nodes | n8n Docs(n8n Docs)
  3. Google Service Account | Nodes | n8n Docs(n8n Docs)
  4. Sheet Within Document operations | Nodes | n8n Docs(n8n Docs)
  5. Google Sheets node common issues | n8n Docs(n8n Docs)
  6. n8n Form | Nodes | n8n Docs(n8n Docs)
  7. HTML | Nodes | n8n Docs(n8n Docs)
  8. Usage limits | Google Sheets API(Google for Developers)

把這篇放進別人的河裡

ThreadsLINEX

river breath・河的呼吸

讀完不急著走。跟著河面呼吸三輪,把讀到的,沉下去。

吸 —— 讓念頭浮起

「唵」—— 圓滿俱足,我與河本為一體

Wudelay ・ 人生之河

同一條支流

n8n 和 Make 差在哪?自動化工具比較

2026-08-31約 9 分鐘

深入了解 N8N: 工作流節點與部署選擇

2026-03-22約 3 分鐘

我的自動化之旅 – N8N

2026-03-20約 3 分鐘