Workflow n8n Google Sheets:超出 ReadRequestsPerMinutePerUser 配額

描述問題/錯誤/疑問

我在自託管 Ubuntu VPS 上執行 n8n(Docker + SQLite 資料庫),今天遇到了 Google Sheets 配額和執行堆積的問題。

背景
n8n 2.21.x in Docker Compose,SQLite 資料庫掛載在磁碟卷上。
“經典” 模式(無外部佇列),N8N_CONCURRENCY_PRODUCTION_LIMIT 現在設定為
已啟用 Runners(N8N_RUNNERS_ENABLED=true)。
已停用 Insights/診斷(N8N_INSIGHTS_ENABLED=false、N8N_DIAGNOSTICS_ENABLED=false)以避免額外的 SQLite 錯誤。

工作流程架構

  1. Webhook 工作流程(建立請求)
    HTTP Webhook 接收結構化的客服請求。
    “標準化承載量” Code 節點,對欄位進行對應和清理(類別、子類別、電子郵件、訊息、附件、請求 ID 等)。
    “按類別路由” Switch,將其發送到三個分支(例如 LED 燈帶 / 電源供應 / 外殼)。
    每個分支都會執行 Google Sheets → 附加到同一檔案的專用工作表(每個請求一行,初始狀態和決定設為 “待審批”)。
    此工作流程運作良好。

  2. 計劃工作流程(處理待審批行)
    這是有問題的工作流程。
    Schedule Trigger 設定為 1 分鐘(在 JSON 匯出中)。
    Get row(s) in sheet v4.7:
    Resource:Sheet Within Document。
    Operation:Get Row(s)。
    Document:By ID(Google Sheet 的 ID)。
    Sheet:By ID(工作表 ID)。
    Range:I1:I100 或 I1:I1000(具有標頭的狀態欄)。
    Filter:Status 欄 = en_attente_validation。
    已啟用選項:“Return only First Matching Row”,以便每次執行只處理一行。
    “準備 - LED 燈帶” Code:
    檢索該行(決定、狀態、顏色、電子郵件等),
    如果決定為空 / “待審批”,或如果狀態 ≠ en_attente_validation,或決定未被識別,則忽略,
    計算促銷代碼 + 產品連結,
    輸出結構化 JSON(包含行索引),隨後用於 Gorgias 和更新工作表。
    根據決定,工作流程的其餘部分:
    透過 Gorgias 傳送票證/回應,
    更新工作表中的狀態(根據情況使用多個 Update row in sheet 節點),
    必要時更新其他工作表。
    觀察到的問題

A. “Starting soon / Queued” 狀態的執行激增
在 Executions 標籤中,我經常看到:
一系列 “Starting soon / Queued at HH:MM:SS” 執行具有相同的時間戳,
儘管界面顯示 “No active executions”。
在停用 insights 之前,日誌還顯示了與內部指標相關的重複 SQLite 錯誤(“Error while saving insights metadata and raw data”,SQLITE_ERROR: ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint)。新增 N8N_INSIGHTS_ENABLED=false 並重新啟動後,這些錯誤消失了。

B. Google Sheets 429 / 超過配額的錯誤
Get row(s) in sheet 節點最終總是失敗,錯誤訊息為:
The service is receiving too many requests from you
Quota exceeded for quota metric ‘Read requests’ and limit ‘Read requests per minute per user’ of service ‘sheets.googleapis.com’(配額為 60 次讀取/分鐘)。
查看 Google Cloud 端的指標時,我看到的 GetSpreadsheet / read_requests 數量遠超我對簡單 “get rows” 的預期,該操作每 1–2 分鐘執行一次,特別是在啟用新的 “Return only First Matching Row” 選項之後。

已經嘗試過的方法
n8n 方面:並發量降低到 1(N8N_CONCURRENCY_PRODUCTION_LIMIT=1)。
已停用 Insights/診斷以消除 SQLite 雜訊。
Sheets v4.7 節點方面:將 Document / Sheet 從 “From list” 改為 By ID。
明確的範圍 I1:I1000 包括第 1 行(標頭),否則 n8n 找不到 Status 欄。
Filter Status = en_attente_validation。
已啟用 “Return only First Matching Row” 選項,以便每次執行只處理一行。
“準備 - LED 燈帶” Code 方面:
新增防護:如果輸入為空(items.length === 0),返回 以停止工作流程,
在將任何內容傳送到 Gorgias 或 Update 節點之前篩選所有不相關的行。

我也在考慮
減少 Schedule Trigger 的頻率(從 1 分鐘改為 5 分鐘),
驗證沒有其他 n8n 工作流程使用同一帳戶存取相同的 Sheets。
我期望得到的回饋
有沒有其他人在使用 Google Sheets “Get row(s) in sheet” 節點版本 4.7(Sheet Within Document、By ID)時注意到讀取請求量非常高,即使在 “Return only First Matching Row” + 受限範圍的模式下?
您有用於定期處理 Google Sheets 行的 “安全” 模式嗎,同時遵守 ReadRequestsPerMinutePerUser = 60 的配額?
例如:每次執行讀取一行,確保不會在所有分支中重複讀取同一工作表等。

您會建議
保留 v4.7 但採用其他配置,
為此用例恢復到較舊的節點(4.5),
完全從 Google Sheets 中移出此邏輯(Apps Script、專用資料庫等)?
我很樂意聽取經驗分享 / 最佳實踐,特別是對於:
限制重複的 GetSpreadsheet,
避免 “Starting soon / Queued” 執行激增,
並在不完全改變架構的情況下保持穩定。

錯誤訊息是什麼(如果有的話)?

請分享您的工作流程

(在您的畫布上選擇節點,並使用鍵盤快捷鍵 CMD+C/CTRL+C 和 CMD+V/CTRL+V 複製和貼上工作流程。)

分享最後一個節點傳回的輸出

您的 n8n 設定相關資訊

  • n8n 版本
  • 資料庫(預設值:SQLite)
  • n8n EXECUTIONS_PROCESS 設定(預設值:own、main)
  • 透過以下方式執行 n8n(Docker、npm、n8n cloud、桌面應用)
  • 作業系統

@Arthur_Mascot 你在撞到 Sheets API 的讀取配額限制,因為每分鐘的 Schedule Trigger × 3 個工作流程 × 範圍讀取疊加速度很快,超過 Google 的每分鐘限制。最快的解決方案是把排程頻率降到 5 分鐘——對於「manager fills decision」使用案例,小延遲不成問題。更好的長期方案是使用 Google Sheets Trigger 節點,它用 Drive push notifications 代替輪詢,基本上不佔 API 配額。你實際上多久需要一次選定決策?

感謝你提供 Google Sheets Trigger 的線索,我會深入研究。

不過我想澄清一下:在我今天所有的測試期間,我只有一個活躍的工作流程,僅有一個 Schedule Trigger 設定為 1 分鐘。不是 3 個工作流程並行運行。我仍然達到了 429 ReadRequestsPerMinutePerUser 配額。所以問題似乎來自**Get row(s) in sheet 節點本身在單次執行中產生的呼叫數量**,而不是多個工作流程的累積。

@Arthur_Mascot 問題可能是 API 呼叫的數量,請使用 wait node。

@Arthur_Mascot
我也想起你可以使用「回傳所有符合項目」+ 「分割輸出」的選項,這樣只需要呼叫一次 API,並避免原生 Google Sheets 觸發器消耗配額速度快 3 倍的問題。

這裡有兩件值得補充的事。你的 Cloud metrics 中額外的 GetSpreadsheet API 呼叫很可能來自 n8n 的 Google Sheets 節點在每次執行時進行的 schema fetch —— 甚至在實際的列查詢執行之前。你可以將 Document 和 Sheet 欄位設定為「By ID」(這是你已經做過的)來減少這種情況,但也要確保你沒有使用任何動態欄位,因為那會強制 n8n 在每次執行時重新載入欄位清單。

關於執行叢集:這是啟動追趕行為啟動的現象。請參考我剛回覆的 Schedule Trigger 執行緒 —— 在 Schedule Trigger 節點的 Settings 索引標籤中關閉「Fire on startup catch-up」(或設定 WORKFLOWS_QUEUE_STARTUP=false)應該能停止啟動時的批次執行,並直接減少 Google Sheets 呼叫的並發突發。