5 changed files with 3235 additions and 191 deletions
@ -0,0 +1,76 @@ |
|||||||
|
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() |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue