Install
openclaw skills install @thinhbuiii/google-sheets-connectKết nối Google Drive/Sheets trong 1 câu: agent in link uỷ quyền OAuth, người dùng bấm Allow + dán mã, agent lưu phiên làm việc và test tạo/ghi/format Sheet thật. Dùng được cho cả Gmail cá nhân và Google Workspace, không cần gcloud, không cần vào Cloud Console.
openclaw skills install @thinhbuiii/google-sheets-connectSkill này cho agent quyền tạo và sửa file Google Sheet/Docs/Drive bằng phiên uỷ quyền của chính người dùng — quota tính vào Drive của người dùng, y như connector Google Drive của ChatGPT.
❌ Không dùng service account. Service account không có storage quota → Google chặn tạo file mới trong Drive cá nhân. Đó chính là blocker của cách cũ (phải nhờ người dùng tạo file trống trước). ✅ Dùng phiên uỷ quyền người dùng: agent đóng vai chính người dùng → tạo folder, tạo Sheet, sửa dữ liệu, format, xoá đều được.
Kết nối Google Drive giúp tôi
hoặc
Cho agent quyền tạo Google Sheet
hoặc
Cài skill google-sheets-connect
Agent hiểu ngay và chạy quy trình dưới. KHÔNG hỏi người dùng về project, API, service account, terminal.
Kiểm tra máy đã có thông tin app OAuth chưa (tệp ~/.config/gdrive-connect/app.json, hoặc env GDRIVE_CLIENT_ID / GDRIVE_CLIENT_SEC):
python3 -c "import os;p=os.path.expanduser('~/.config/gdrive-connect/app.json');ok=os.path.exists(p) or (os.environ.get('GDRIVE_CLIENT_ID') and os.environ.get('GDRIVE_CLIENT_SEC'));print('OK' if ok else 'MISSING')"
OK → sang Bước 1.MISSING → xem mục 4 "Tạo app OAuth" rồi lưu thông tin vào app.json (quyền 600) hoặc env gateway.cd <skill_dir> && python3 scripts/gdrive_connect.py start
Output là 1 URL dài. Gửi nguyên URL cho người dùng kèm hướng dẫn ngắn (copy nguyên văn):
Bấm link → chọn tài khoản Google → Allow. Sau đó trình duyệt sẽ nhảy sang địa chỉ dạng
http://127.0.0.1:8765/?code=4/0A...và báo "không truy cập được" — đó là bình thường, không phải lỗi. Anh/chị copy nguyên thanh địa chỉ đó dán lại vào chat là xong.
⚠️ Vì sao không dùng "mã code" hiện trên màn hình nữa: Google đã bỏ hoàn toàn luồng OOB (
urn:ietf:wg:oauth:2.0:oob) từ 2022 → link cũ báoError 400: invalid_request. Skill này dùng loopback redirecthttp://127.0.0.1:8765, đúng chuẩn Desktop app hiện nay.
Người dùng dán cả URL (hoặc chỉ mã 4/0A... — script tự bóc cả 2 dạng):
cd <skill_dir> && python3 scripts/gdrive_connect.py finish '<URL_HOẶC_CODE>'
✅ Đã lưu + email + quota → sang Bước 3.invalid_grant → mã đã dùng/hết hạn/copy thiếu → quay lại Bước 1.redirect_uri_mismatch → app không phải loại Desktop app → tạo lại đúng loại.access_blocked / org_internal → Workspace chặn app ngoài → xem mục 5.cd <skill_dir> && python3 scripts/gdrive_ops.py selftest
Kỳ vọng 6/6 ✅. Nếu có bước ⚠️ → báo đúng bước đó, không nói "thành công" chung chung.
<email>, quota <x> GB.Tất cả qua scripts/gdrive_ops.py:
| Việc | Lệnh |
|---|---|
| Xem tài khoản đang kết nối | whoami |
| Liệt kê file | list --parent <folderId> --limit 30 |
| Tìm file | list --query "name contains 'BÁO CÁO'" |
| Tạo folder | mkdir --name "BÁO CÁO T10.2026" --parent <id> |
| Tạo Sheet mới | new-sheet --name "BÁO CÁO 1/10 - 7/10" --parent <id> |
| Xem các tab | tabs --file <id> |
| Thêm tab | add-tab --file <id> --title "Tổng quan" |
| Đọc dữ liệu | read --file <id> --range "Tổng quan!A1:H20" |
| Ghi đè vùng | write --file <id> --range "Tổng quan!A1" --values '[[...]]' |
| Thêm dòng | append --file <id> --range "Tổng quan!A1" --values '[[...]]' |
| Định dạng | format --file <id> --spec '{"repeatCell":{...}}' |
| Xoá tab | delete-tab --file <id> --sheet-id 0 --yes |
| Xoá file | delete --file <id> --yes |
| Test toàn bộ | selftest |
| Kiểm tra trạng thái | gdrive_connect.py status |
| Ngắt kết nối | gdrive_connect.py logout |
Ghi dữ liệu: mặc định USER_ENTERED (Google tự hiểu số/ngày/công thức). Muốn ghi thô đúng từng ký tự → thêm --raw.
--values là JSON 2 chiều, ví dụ: '[["Chỉ số","Giá trị"],["Chi tiêu",148716339]]'#,##0" đ" — KHÔNG ghi chuỗi "148.716.339 đ" (sẽ thành text, không tính toán được)."1.72" nếu muốn giữ đúng 1.72 (tránh Google tự đổi thành ngày).{"repeatCell":{"range":{"sheetId":0,"startRowIndex":0,"endRowIndex":1},
"cell":{"userEnteredFormat":{"textFormat":{"bold":true},
"backgroundColor":{"red":1,"green":0.95,"blue":0.6}}},
"fields":"userEnteredFormat(textFormat,backgroundColor)"}}
Người dùng không cần làm phần này — agent làm, chỉ cần người dùng mở link xác nhận nếu Google yêu cầu.
console.cloud.google.com → tạo project (hoặc chọn project có sẵn).drive, spreadsheets → nếu app ở chế độ Testing thì thêm email người dùng vào Test users.Client se… trên màn hình).mkdir -p ~/.config/gdrive-connect && chmod 700 ~/.config/gdrive-connect
printf '{"client_id":"%s","client_sec":"%s"}' "$CLIENT_ID" "$CLIENT_SECRET" > ~/.config/gdrive-connect/app.json
chmod 600 ~/.config/gdrive-connect/app.json
(Không cần restart gateway nếu app.json đã có trước khi chạy Bước 1. Nếu lỡ đặt qua env gateway thì restart gateway.) 6. Quay lại Bước 1.
💡 App ở chế độ Testing thì phiên hết hạn sau 7 ngày — phải bấm Publish app để phiên sống lâu (không cần verify nếu chỉ dùng nội bộ <100 user).
| Triệu chứng | Nguyên nhân | Cách xử lý |
|---|---|---|
invalid_client | thông tin app sai hoặc chưa nạp | kiểm tra app.json / env rồi chạy lại start |
invalid_grant khi finish | mã đã dùng / quá 10 phút | chạy start lấy link mới |
access_blocked / org_internal | Workspace chặn app ngoài | nhờ admin allowlist client id, hoặc tạo app OAuth trong project của công ty (mục 4) |
Error 400: invalid_request khi bấm link | đang dùng luồng OOB (đã bị Google bỏ) | skill từ v1.4 dùng loopback 127.0.0.1:8765; nếu vẫn thấy lỗi → kiểm tra REDIRECT_URI trong gdrive_connect.py KHÔNG còn urn:ietf:wg:oauth:2.0:oob |
Error 400: redirect_uri_mismatch | app không phải loại Desktop app | tạo lại đúng loại Desktop app (Desktop app tự cho phép http://127.0.0.1:<port>) |
Trang 127.0.0.1:8765 báo không truy cập được | bình thường — không có server local | copy nguyên thanh địa chỉ dán lại vào chat |
| Phiên chết sau ~7 ngày | app còn ở Testing | Publish app lên Production |
403 insufficientPermissions | chưa bật Drive/Sheets API | bật API trong Library |
403 storageQuotaExceeded | Drive người dùng đầy | báo người dùng dọn bớt |
| Không thấy file của người khác | file chưa share cho tài khoản đã kết nối | share Editor cho đúng email đã kết nối |
~/.config/gdrive-connect/ với quyền 600 cho file, 700 cho thư mục. KHÔNG in nội dung phiên ra chat/log.--yes hoặc env GDRIVE_ALLOW_DELETE=1. Trước khi xoá phải nêu rõ tên file/tab và chờ người dùng xác nhận.| Giới hạn | Chi tiết |
|---|---|
| Không tự đăng nhập thay người dùng | Người dùng phải bấm Allow ít nhất 1 lần |
| Vẫn phải dán 1 lần | Google bắt buộc với desktop app (không có domain callback). Nhưng chỉ cần copy thanh địa chỉ, không phải tìm mã |
| Không dùng được nếu Workspace cấm app ngoài | Trừ khi admin allowlist hoặc dùng app nội bộ |
| Không sửa được file chưa share | File riêng của người khác, chưa share cho tài khoản đã kết nối |
| Phiên Testing hết hạn 7 ngày | Publish app để khắc phục |
| Không hỗ trợ Shared Drive đặc thù | Có thể thêm supportsAllDrives nếu cần |
scripts/gdrive_connect.py — start / finish / status / logout.scripts/gdrive_ops.py — thao tác Drive/Sheets + selftest.Chỉ dùng thư viện chuẩn Python 3 (urllib). Không cần pip install.