import os import json from googleapiclient.discovery import build from googleapiclient.errors import HttpError # Конфигурация SPREADSHEET_IDS = ["1j12H6NCZec9MEWQypPbzhETNtn58fnin1HBRkkr3a1w", "1iJAfffxm5-rFXi8LB5g1rChp94Qfo-mgSDxsDii27oo"] # Список ID таблиц BACKUP_FOLDER = "sheets_backup" # Папка для сохранения CURRENT_DATA_FILE = os.path.join(BACKUP_FOLDER, "current_data.json") # Файл текущих данных CHANGES_FILE = os.path.join(BACKUP_FOLDER, "changes.json") # Файл изменений # Аутентификация Google Sheets API def get_service(): from google.oauth2.service_account import Credentials creds = Credentials.from_service_account_file("botforclinic-436512-0c117dd103a8.json") return build("sheets", "v4", credentials=creds) def load_current_data(): """Загружает текущие данные из локального файла.""" if os.path.exists(CURRENT_DATA_FILE): with open(CURRENT_DATA_FILE, "r", encoding="utf-8") as f: return json.load(f) return {} def save_current_data(data, file_path): """Сохраняет данные в указанный файл.""" with open(file_path, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=4) def calculate_changes(old_data, new_data): """Вычисляет изменения между старыми и новыми данными.""" changes = {} for sheet_title, rows in new_data.items(): old_rows = set(tuple(row) for row in old_data.get(sheet_title, [])) new_rows = set(tuple(row) for row in rows) added_rows = new_rows - old_rows if added_rows: changes[sheet_title] = [list(row) for row in added_rows] return changes def backup_google_sheets(): """Создаёт копию всех таблиц, вычисляет изменения и сохраняет данные.""" service = get_service() if not os.path.exists(BACKUP_FOLDER): os.makedirs(BACKUP_FOLDER) current_data = load_current_data() updated_data = {} for spreadsheet_id in SPREADSHEET_IDS: try: spreadsheet = service.spreadsheets().get(spreadsheetId=spreadsheet_id).execute() spreadsheet_title = spreadsheet.get("properties", {}).get("title", "Unknown_Table") sheets = spreadsheet.get("sheets", []) for sheet in sheets: sheet_title = sheet.get("properties", {}).get("title", "Unknown_Sheet") range_name = f"'{sheet_title}'" result = service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=range_name).execute() data = result.get("values", []) updated_data[f"{spreadsheet_title}::{sheet_title}"] = data except HttpError as error: print(f"Ошибка при обработке таблицы ID {spreadsheet_id}: {error}") # Вычисляем изменения changes = calculate_changes(current_data, updated_data) # Сохраняем обновлённые данные и изменения save_current_data(updated_data, CURRENT_DATA_FILE) save_current_data(changes, CHANGES_FILE) print("Данные успешно обновлены и сохранены.") print("Изменения:", changes if changes else "Нет изменений.") if __name__ == "__main__": backup_google_sheets()