Spaces:
Running
Running
| import os | |
| import json | |
| import logging | |
| from google.oauth2 import service_account | |
| from googleapiclient.discovery import build | |
| from datetime import datetime | |
| # Cấu hình Log | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| # File json key bạn đã upload lên (đảm bảo file này nằm cùng thư mục) | |
| SERVICE_ACCOUNT_FILE = 'service_account.json' | |
| SCOPES = ['https://www.googleapis.com/auth/spreadsheets'] | |
| class GoogleSheetClient: | |
| def __init__(self): | |
| self.creds = None | |
| self.service = None | |
| self.connect() | |
| def connect(self): | |
| """Kết nối đến Google Sheets API dùng Service Account""" | |
| try: | |
| if os.path.exists(SERVICE_ACCOUNT_FILE): | |
| self.creds = service_account.Credentials.from_service_account_file( | |
| SERVICE_ACCOUNT_FILE, scopes=SCOPES | |
| ) | |
| self.service = build('sheets', 'v4', credentials=self.creds) | |
| logger.info("✅ Google Sheets API: Kết nối thành công.") | |
| else: | |
| logger.warning(f"⚠️ Không tìm thấy {SERVICE_ACCOUNT_FILE}. Chức năng ghi Sheet sẽ bị tắt.") | |
| except Exception as e: | |
| logger.error(f"❌ Lỗi kết nối Google Sheets: {e}") | |
| def append_row(self, sheet_id, data_row, sheet_range="Sheet1!A1"): | |
| """Ghi dòng mới vào Sheet""" | |
| if not self.service: return {"status": "skipped", "reason": "No service"} | |
| try: | |
| body = { "values": [data_row] } | |
| result = self.service.spreadsheets().values().append( | |
| spreadsheetId=sheet_id, range=sheet_range, | |
| valueInputOption="USER_ENTERED", insertDataOption="INSERT_ROWS", | |
| body=body | |
| ).execute() | |
| return {"status": "success"} | |
| except Exception as e: | |
| logger.error(f"❌ Lỗi ghi Sheet: {e}") | |
| return {"status": "error", "message": str(e)} | |
| # Khởi tạo singleton | |
| gsheet_client = GoogleSheetClient() |