·

Google Sheets MCP với Gemini CLI

Cài đặt Google Sheets MCP trong Gemini CLI để AI agent có thể đọc và ghi dữ liệu bảng tính ngay trong trình soạn thảo.

Gemini CLI có một lợi thế tự nhiên khi làm việc với Google Sheets: cùng một hệ sinh thái Google, nên việc cấu hình OAuth và quyền truy cập ít khi vướng vào các vấn đề "app chưa verify" phức tạp như khi bạn dùng OAuth client của bên thứ ba. Nhưng điều đó không có nghĩa Gemini CLI xử lý dữ liệu Sheets khác biệt về bản chất so với các client khác — nó vẫn gọi đúng những tool MCP giống Claude Code hay Cursor, chỉ khác ở cách đọc config và cách hiển thị kết quả. Bài này tập trung vào cài đặt, kỹ thuật tổng hợp/pivot dữ liệu, một ví dụ báo cáo tuần thực tế, và so sánh output giữa Gemini CLI với Claude Code khi xử lý cùng một tác vụ.

Cài Đặt và Kết Nối Google Sheets MCP với Gemini CLI

Gemini CLI đọc config MCP server từ settings.json, ở cấp project (.gemini/settings.json) hoặc cấp global (~/.gemini/settings.json). Cấu trúc theo mẫu khá quen thuộc nếu bạn đã cấu hình client khác trước đó:

{
  "mcpServers": {
    "sheets": {
      "command": "uvx",
      "args": ["--from", "mcp-google-sheets", "mcp-google-sheets"],
      "env": {
        "SERVICE_ACCOUNT_PATH": "$HOME/.config/sheets-mcp/service-account.json"
      },
      "timeout": 30000
    }
  }
}

Trước khi đặt config này, tạo service account như đã mô tả ở bài 1 — bật Google Sheets API và Google Drive API trên project trong Cloud Console, tạo service account, tải file JSON key, và share từng spreadsheet cần dùng với email của service account đó.

Xác nhận server đã được nhận diện:

gemini
/mcp

Lệnh này liệt kê từng server đã cấu hình cùng trạng thái. Nếu sheets hiện failed, hai nguyên nhân phổ biến nhất cần kiểm tra trước: biến SERVICE_ACCOUNT_PATH có resolve đúng không (Gemini CLI có expand $HOME trong giá trị config, nhưng nên echo trực tiếp đường dẫn literal nếu bạn không chắc), và version package mcp-google-sheets cài qua uvx có khớp bản bạn test tay không. Một nguồn nhầm lẫn phổ biến khác: settings.json cấp project và cấp global có cấu hình lệch nhau — cấp project luôn override cấp global, nên khi một thứ "tự nhiên hết chạy" dù bạn không đổi gì, kiểm tra cả hai file, vì có thể ai đó (hoặc chính bạn ở phiên trước) đã sửa file project mà quên.

Mẹo: Kiểm tra cả settings.json cấp project và cấp global khi một kết nối đang chạy tốt tự nhiên gãy — file project âm thầm override file global, và config cũ còn sót ở một trong hai chỗ là nguyên nhân phổ biến nhất của kiểu lỗi "tự nhiên hết chạy" này.

Tổng Hợp và Pivot Dữ Liệu Spreadsheet Từ Gemini CLI

Tổng hợp dữ liệu (aggregation) và pivot là tác vụ agent xử lý tốt nhất trên Sheets, vì nó thay thế trực tiếp việc bạn phải tự dựng pivot table hoặc viết công thức QUERY/SUMIFS lồng nhau.

Đọc range "Expenses!A1:F1000" trong spreadsheet ID 1QwErTy...
Cột: date, category, amount, department, approved_by, notes.
Pivot: tổng amount theo (department, category), chỉ tính các dòng approved_by khác rỗng.
In kết quả dạng bảng pivot với department là dòng, category là cột.

Với dữ liệu cần group theo thời gian (theo tuần/tháng/quý), luôn chỉ định rõ định dạng ngày gốc và cách bạn muốn group, vì đây là điểm agent dễ suy đoán sai nhất khi không được nói rõ:

Cột "date" ở định dạng yyyy-mm-dd. Group theo tuần ISO (thứ Hai là ngày bắt đầu tuần),
không group theo tuần dương lịch kiểu Chủ Nhật bắt đầu.

Khi kết quả pivot cần ghi lại vào sheet dưới dạng công thức thật (không phải giá trị tĩnh) — ví dụ để người xem sau này vẫn thấy công thức và tin tưởng số liệu hơn — yêu cầu agent dùng QUERY hoặc SUMIFS native của Sheets thay vì tính sẵn rồi ghi giá trị:

Ghi công thức QUERY vào ô A1 của tab mới "Pivot-By-Dept" thay vì ghi giá trị tĩnh,
để công thức tự cập nhật khi dữ liệu gốc ở tab Expenses thay đổi.
Dùng valueInputOption USER_ENTERED để Sheets parse công thức đúng.

Mẹo: Khi báo cáo cần "sống" — tự cập nhật khi dữ liệu gốc thay đổi — luôn yêu cầu agent ghi công thức Sheets thật (QUERY, SUMIFS) thay vì giá trị đã tính sẵn. Giá trị tĩnh nhìn đúng ngay lúc đó nhưng sẽ "chết" (không còn phản ánh dữ liệu mới) ngay khi ai đó thêm dòng vào bảng nguồn.

Ví Dụ Thực Tế: Sinh Báo Cáo Số Liệu Hằng Tuần Từ Dữ Liệu Thô

Một workflow rất thực tế cho team engineering hoặc product: mỗi thứ Hai, tổng hợp số liệu tuần trước từ một sheet log thô (ví dụ log deploy, log incident, hoặc log ticket support) thành một báo cáo ngắn gửi cho stakeholder.

Đọc tab "Support-Tickets-Raw" (cột: created_at, priority, resolved_at, category).
Lọc các ticket có created_at trong tuần ISO trước (tuần kết thúc Chủ Nhật vừa rồi).
Tính:
- Tổng số ticket mới trong tuần
- Số ticket đã resolved trong tuần, thời gian resolve trung bình theo priority
- Top 3 category có nhiều ticket nhất

Ghi vào tab "Weekly-Report", theo format:
Dòng 1: "Báo cáo tuần [ngày bắt đầu] - [ngày kết thúc]"
Dòng 3 trở đi: các số liệu trên, mỗi số liệu một dòng, có label rõ ràng.
Sau đó viết một đoạn tóm tắt 3-4 câu bằng tiếng Việt tự nhiên về tình hình tuần này,
đặt ở dòng cuối tab, so sánh nhanh với tuần trước nếu có đủ dữ liệu.

Phần "viết đoạn tóm tắt bằng ngôn ngữ tự nhiên" chính là nơi agent tạo giá trị vượt xa một pivot table thông thường — nó không chỉ tổng hợp số, mà diễn giải số đó thành câu chuyện ngắn gọn cho người không có thời gian đọc bảng số liệu.

Mẹo: Luôn yêu cầu agent so sánh với kỳ trước khi viết tóm tắt tự nhiên, và chỉ so sánh khi có đủ dữ liệu (không suy diễn khi thiếu) — một tóm tắt nói "tăng 40%" dựa trên dữ liệu tuần trước không đầy đủ gây hiểu nhầm nghiêm trọng hơn là không có tóm tắt.

So Sánh Output Google Sheets MCP Giữa Gemini CLI và Claude Code

Với cùng một tool MCP server, kết quả tool-call (dữ liệu trả về từ Google Sheets API) giống nhau hoàn toàn — sự khác biệt nằm ở cách mỗi client điều phối và trình bày:

  • Claude Code có xu hướng tự chia nhỏ range lớn thành nhiều lệnh đọc nếu ước lượng vượt giới hạn context an toàn, và thường hỏi rõ trước khi ghi đè tab đã tồn tại.
  • Gemini CLI thường hiển thị toàn bộ JSON response thô của tool-call trong log verbose (bật bằng --debug hoặc cấu hình checkpointing), hữu ích khi bạn cần debug chính xác giá trị agent nhận được, nhưng dài hơn nếu bạn không cần chi tiết đó ở output chính.
  • Cách hai client xử lý timeout trên request lớn cũng khác: Gemini CLI dùng giá trị timeout bạn set trong settings.json cho từng server, còn Claude Code có cơ chế timeout mặc định riêng khó override per-server hơn.

Với dữ liệu cực lớn hoặc pipeline cần chạy định kỳ không người canh, sự khác biệt về cách hiển thị output ít quan trọng hơn khả năng cấu hình timeout và retry rõ ràng — đây là điểm Gemini CLI có lợi thế nhẹ nhờ config timeout minh bạch theo từng server.

Mẹo: Nếu bạn không chắc client nào phù hợp hơn cho một workflow Sheets cụ thể, chạy thử đúng một prompt giống nhau trên cả hai và so sánh thời gian hoàn thành cùng số lần tool-call thực tế (không phải chỉ nhìn kết quả cuối) — sự khác biệt về hiệu năng điều phối tool-call rõ ràng hơn nhiều khi bạn nhìn vào log chi tiết, không phải câu trả lời cuối cùng.

Tips

  • Kiểm tra cả settings.json cấp project và global khi kết nối "tự nhiên hỏng" — cấp project luôn override cấp global.
  • Với báo cáo cần tự cập nhật, ghi công thức Sheets thật, không ghi giá trị tĩnh đã tính sẵn.
  • Luôn chỉ định rõ định dạng ngày và quy tắc group theo thời gian (tuần ISO hay tuần dương lịch).
  • So sánh log chi tiết (verbose/debug) giữa các client nếu cần quyết định công cụ nào phù hợp cho một pipeline cụ thể.

Mẹo: Set giá trị timeout trong settings.json của Gemini CLI cao hơn mặc định cho mọi server Sheets xử lý sheet lớn — timeout quá ngắn là nguyên nhân phổ biến nhất của các lỗi tool-call "không rõ nguyên nhân" khi dữ liệu vượt vài nghìn dòng.