Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "CNTT" các nội dung bạn quan tâm.

Sử dụng Google Sheet để làm File Master kết nối dữ liệu, kết quả

ICT

Khi triển khai Automation, chúng ta cần 1 file log để lưu các kết quả đầu vào, đầu ra, trạng thái các công việc. File này cũng là sản phẩm cuối cùng (link tới các nguồn cụ thể khác) để đưa vào các hệ thống.

Ví dụ:

+ Đăng lên website, facebook, zalo, ...

+ Theo dõi trùng lặp.

+ Tái sử dụng cho nhiều mục đích.

Mặc dù có các giải pháp khác hay hơn là dùng csv. Nhưng csv lại không tận dụng được sức mạnh của các Agent/Skill đã tích hợp sẵn trong ChatGPT.

  • Nếu chúng ta chỉ dùng AI qua API thì csv vẫn là tốt nhất.
  • Nhưng chúng ta dùng chatGPT web thì google sheet lại là tốt nhất. Vì ChatGPT có thể trực tiếp trả kết quả về Google sheet.

Đó là lý do chúng ta dùng google sheet.

Và do đó chúng ta cần python cũng có thể làm việc được với google sheet để không mất công chuyển google sheet về xlsx/csv để cho python làm.

 

1. Tạo thư mục làm việc trên Windows

Tạo cấu trúc:

 
C:\BOT\google_sheet_worker\
├── credentials\
│   └── google-service-account.json
├── test_google_sheet.py
└── .venv\
 

Mở PowerShell:

 
mkdir C:\BOT\google_sheet_worker
mkdir C:\BOT\google_sheet_worker\credentials
cd C:\BOT\google_sheet_worker
 

2. Tạo Google Cloud Project

2.1. Truy cập Google Cloud Console bằng tài khoản Google đang quản lý bảng tính.

Link https://cloud.google.com/cloud-console

 

2.2. Click vào Go to my console sẽ vào projects

Click vào project muốn làm việc nhé (gần chữ Google Cloud) ở hình trên nhé.

2.3. Nếu muốn tạo project mới thì click New Project ở cửa sổ popup nhé

Sau đó đặt tên, ví dụ:

 
Windows Google Sheet Worker
2.4. Chọn Create.
2.5. Chuyển sang Project vừa tạo.

Google Sheets API phải được bật trong một Google Cloud Project trước khi ứng dụng Python có thể sử dụng.


3. Bật Google Sheets API và Google Drive API

Trong Google Cloud Console:

 
APIs & Services
→ Library
Chỗ select gần Quick access nhé

Tìm và bật lần lượt:

 
Google Sheets API
Google Drive API
 

Bật Google Drive API (hình minh họa dưới đây là đã bật rồi)

 

Bật Google Sheets API (hình minh họa dưới đây là đã bật rồi)

Với thư viện gspread, tài liệu hiện tại hướng dẫn bật cả Google Sheets API và Google Drive API.


4. Tạo Service Account

Lại quay trở lại trang chủ dự án bạn đang làm của Google Cloud console nhé.

Ví dụ  https://console.cloud.google.com/welcome?project=content-registry-[id] 

Vào:

IAM & Admin
→ Service Accounts
→ Create Service Account
 
IAM & Admin thấy ở Quick Access như hình trên nhé.
Sau đó vào → Service Accounts → Create Service Account (hình dưới)
 

Điền:

 
Service account name: Windows Sheet Worker
Service account ID: windows-sheet-worker
Description: Đọc ghi Google Sheet từ máy Windows
 

Chọn:

 
Create and continue
 

Ở phần:

 
Grant this service account access to project
 

có thể bỏ qua, không cần chọn Role cho nhu cầu đọc/ghi bảng tính được chia sẻ trực tiếp.

Chọn:

 
Continue
→ Done
 

Sau khi tạo, Google cấp cho Service Account một địa chỉ dạng (hình dưới. hình này ví dụ thôi nhé, ID đã được đổi rồi):

windows-sheet-worker@ten-project.iam.gserviceaccount.com
 

Google xác nhận địa chỉ Service Account được tạo theo cấu trúc SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com.


5. Tạo và tải khóa JSON

Trong danh sách Service Accounts:

  1. Bấm vào Service Account vừa tạo.
  2. Chọn tab Keys.
  3. Chọn:
 
Add key
→ Create new key
→ JSON
→ Create
 
Key thu được

Một file JSON sẽ được tải xuống máy. Đổi tên thành:

 
google-service-account.json
 

Chuyển file vào:

 
C:\BOT\google_sheet_worker\credentials\google-service-account.json
 

Quy trình tạo khóa JSON qua Manage keys → Add key → Create new key → JSON cũng là cách được tài liệu gspread hướng dẫn.

Lưu ý bảo mật

File JSON này chứa khóa riêng, phải xem như mật khẩu:

  • Không để trong thư mục Google Drive đang đồng bộ.
  • Không gửi qua email, Zalo hoặc tải lên GitHub.
  • Không đưa nội dung file JSON vào log.
  • Không đưa file này vào thư mục input mà các script khác tự động tải lên AI hoặc ChatGPT.

Tài liệu gspread cảnh báo file thông tin xác thực chứa dữ liệu nhạy cảm và phải được bảo vệ như private key.


6. Chia sẻ Google Sheet cho Service Account

Mở file:

 
C:\BOT\google_sheet_worker\credentials\google-service-account.json
 

Tìm dòng:

 
"client_email": "windows-sheet-worker@ten-project.iam.gserviceaccount.com"
 

Sao chép địa chỉ email này.

Sau đó mở Google Sheet cần đọc ghi:

 
Share
→ nhập email Service Account
→ chọn Editor
→ Share
 

Đây là bước bắt buộc. Nếu chưa chia sẻ, script thường báo:

 
gspread.exceptions.SpreadsheetNotFound
 

Service Account là một tài khoản riêng và mặc định không có quyền truy cập bảng tính; phải chia sẻ bảng tính cho client_email của nó.


7. Lấy Spreadsheet ID

Ví dụ URL Google Sheet:

 
https://docs.google.com/spreadsheets/d/ViDuIDOpQrStUvWxYz1234567890/edit#gid=0
 

Spreadsheet ID là phần nằm giữa /d//edit:

 
ViDuIDOpQrStUvWxYz1234567890
 

Nên mở bảng tính bằng ID thay vì tên vì tên có thể bị trùng. Tài liệu gspread cũng khuyến nghị sử dụng ID duy nhất của bảng tính.


8. Cài môi trường Python

Google hiện hướng dẫn Python 3.10.7 trở lên cho Sheets API quickstart.

Trong PowerShell:

 
cd C:\BOT\google_sheet_worker

py -m venv .venv

.\.venv\Scripts\python.exe -m pip install --upgrade pip

.\.venv\Scripts\python.exe -m pip install gspread google-auth
 

Kiểm tra:

 
.\.venv\Scripts\python.exe -c "import gspread; print(gspread.__version__)"
 

9. Tạo script kiểm tra kết nối

Tạo file:

 
C:\BOT\google_sheet_worker\test_google_sheet.py
 

Nội dung:

# -*- coding: utf-8 -*-

"""
test_google_sheet.py

Chức năng:
1. Kết nối Google Sheets bằng Service Account.
2. Mở Google Sheet theo Spreadsheet ID.
3. Tạo tab API_TEST nếu chưa có.
4. Ghi dữ liệu kiểm tra vào vùng A1:B2.
5. Đọc lại dữ liệu để xác nhận quyền đọc và ghi.

Thư mục đề xuất:

C:\\BOT\\google_sheet_worker\\
├── credentials\\
│   └── google-service-account.json
└── test_google_sheet.py
"""

from datetime import datetime
from pathlib import Path
import sys

import gspread
from gspread.exceptions import (
   APIError,
   SpreadsheetNotFound,
   WorksheetNotFound,
)


# ============================================================
# CẤU HÌNH
# ============================================================

CREDENTIALS_FILE = Path(
   r"C:\BOT\google_sheet_worker\credentials\google-service-account.json"
)

# Spreadsheet ID nằm giữa /d/ và /edit trong URL Google Sheet.
SPREADSHEET_ID = "ViDuIDOpQrStUvWxYz1234567890"

# Tab dùng để kiểm tra kết nối.
TEST_WORKSHEET_NAME = "API_TEST"


# ============================================================
# HÀM KIỂM TRA CẤU HÌNH
# ============================================================

def validate_config() -> bool:
   """
   Kiểm tra các thông số cấu hình trước khi kết nối Google Sheet.
   """

   if not CREDENTIALS_FILE.is_file():
       print("[ERROR] Không tìm thấy file Service Account:")
       print(f"        {CREDENTIALS_FILE}")
       return False

   if not SPREADSHEET_ID.strip():
       print("[ERROR] Chưa cấu hình SPREADSHEET_ID.")
       return False

   if not TEST_WORKSHEET_NAME.strip():
       print("[ERROR] Chưa cấu hình TEST_WORKSHEET_NAME.")
       return False

   return True


# ============================================================
# HÀM LẤY HOẶC TẠO WORKSHEET
# ============================================================

def get_or_create_worksheet(
   spreadsheet: gspread.Spreadsheet,
   worksheet_name: str,
) -> gspread.Worksheet:
   """
   Lấy worksheet theo tên.

   Nếu worksheet chưa tồn tại thì tạo mới.
   """

   try:
       worksheet = spreadsheet.worksheet(worksheet_name)

       print(f"[INFO] Đã tìm thấy tab: {worksheet_name}")

       return worksheet

   except WorksheetNotFound:
       print(
           f"[INFO] Chưa có tab '{worksheet_name}', "
           "đang tạo mới..."
       )

       worksheet = spreadsheet.add_worksheet(
           title=worksheet_name,
           rows=100,
           cols=10,
       )

       print(f"[INFO] Đã tạo tab: {worksheet_name}")

       return worksheet


# ============================================================
# CHƯƠNG TRÌNH CHÍNH
# ============================================================

def main() -> int:
   """
   Hàm thực thi chính.
   """

   print("=" * 70)
   print("[INFO] Bắt đầu kiểm tra kết nối Google Sheets")
   print("=" * 70)

   if not validate_config():
       return 1

   try:
       print("[INFO] File Service Account:")
       print(f"       {CREDENTIALS_FILE}")

       print("[INFO] Đang xác thực bằng Service Account...")

       client = gspread.service_account(
           filename=str(CREDENTIALS_FILE)
       )

       print("[INFO] Xác thực thành công.")

       print("[INFO] Đang mở Google Sheet...")
       print(f"[INFO] Spreadsheet ID: {SPREADSHEET_ID}")

       spreadsheet = client.open_by_key(SPREADSHEET_ID)

       print("[SUCCESS] Đã mở Google Sheet.")
       print(f"[INFO] Tên bảng tính: {spreadsheet.title}")

       worksheet = get_or_create_worksheet(
           spreadsheet=spreadsheet,
           worksheet_name=TEST_WORKSHEET_NAME,
       )

       current_time = datetime.now().strftime(
           "%Y-%m-%d %H:%M:%S"
       )

       test_values = [
           ["TrangThai", "ThoiGian"],
           ["KET_NOI_OK", current_time],
       ]

       print("[INFO] Đang ghi dữ liệu kiểm tra vào A1:B2...")

       worksheet.update(
           range_name="A1:B2",
           values=test_values,
           value_input_option="USER_ENTERED",
       )

       print("[SUCCESS] Ghi dữ liệu thành công.")

       print("[INFO] Đang đọc lại dữ liệu từ A1:B2...")

       values_read = worksheet.get("A1:B2")

       print("[SUCCESS] Đọc dữ liệu thành công.")
       print("[INFO] Nội dung đọc được:")

       for row in values_read:
           print(f"       {row}")

       if (
           len(values_read) >= 2
           and len(values_read[1]) >= 1
           and values_read[1][0] == "KET_NOI_OK"
       ):
           print("=" * 70)
           print(
               "[SUCCESS] Kết nối Google Sheet thành công. "
               "Script có quyền đọc và ghi dữ liệu."
           )
           print("=" * 70)

           return 0

       print(
           "[WARNING] Đã đọc và ghi được Google Sheet, "
           "nhưng dữ liệu kiểm tra không đúng như dự kiến."
       )

       return 4

   except SpreadsheetNotFound:
       print("[ERROR] Không mở được Google Sheet.")
       print("")
       print("Các nguyên nhân thường gặp:")
       print("1. SPREADSHEET_ID không đúng.")
       print(
           "2. Chưa chia sẻ Google Sheet cho địa chỉ "
           "client_email trong file JSON."
       )
       print(
           "3. Service Account chưa được cấp quyền Editor."
       )
       print(
           "4. Google Sheets API hoặc Google Drive API "
           "chưa được bật."
       )

       return 2

   except APIError as exc:
       print("[ERROR] Google Sheets API trả về lỗi:")
       print(f"        {exc}")

       return 3

   except PermissionError as exc:
       print("[ERROR] Không có quyền đọc file Service Account:")
       print(f"        {exc}")

       return 5

   except ValueError as exc:
       print("[ERROR] File Service Account JSON không hợp lệ:")
       print(f"        {exc}")

       return 6

   except Exception as exc:
       print("[ERROR] Xảy ra lỗi không xác định:")
       print(f"        Loại lỗi: {type(exc).__name__}")
       print(f"        Nội dung: {exc}")

       return 99


# ============================================================
# KHỞI CHẠY
# ============================================================

if __name__ == "__main__":
   exit_code = main()
   sys.exit(exit_code)

 

Tôi dùng chuỗi raw:

 
r"C:\BOT\..."
 

để tránh lỗi SyntaxWarning: invalid escape sequence mà các script Windows trước đây của bạn từng gặp.


10. Chạy thử

Thay dòng:

 
SPREADSHEET_ID = "THAY_SPREADSHEET_ID_VAO_DAY"
 

bằng ID thật.

Sau đó chạy:

 
cd C:\BOT\google_sheet_worker

.\.venv\Scripts\python.exe .\test_google_sheet.py
 

Kết quả đúng sẽ tương tự:

 
[INFO] Đang xác thực bằng Service Account...
[INFO] Đang mở Google Sheet...
[INFO] Đã mở: Tên bảng tính
[INFO] Chưa có tab API_TEST, đang tạo mới...
[INFO] Đang ghi dữ liệu kiểm tra...
[INFO] Đang đọc lại dữ liệu...
[SUCCESS] Kết nối Google Sheet thành công.
[SUCCESS] Đã đọc và ghi được dữ liệu:
[['TrangThai', 'ThoiGian'], ['KET_NOI_OK', '2026-07-13 20:30:00']]
 

Script chỉ tạo hoặc cập nhật tab:

 
API_TEST
 

và vùng:

 
A1:B2
 

nên không ảnh hưởng các tab dữ liệu hiện có.

Sau khi kết nối thành công, bước tiếp theo là xác định Spreadsheet ID, tên tab, hàng tiêu đề, khóa định danh và quy tắc đọc/ghi để viết script xử lý dữ liệu thực tế.