Bot & Automation

Activity Reminder Bot

/root/hermes-projects/Activity Reminder Bot

scripts/cleanup_sheet_rows.py text
from activity_reminder_bot.services.sheets import get_reminder_repository


def main() -> None:
    repo = get_reminder_repository()
    repo.ensure_layout()
    service = repo._build_sheets_service()

    spreadsheet = service.spreadsheets().get(
        spreadsheetId=repo.spreadsheet_id,
        fields="sheets.properties",
    ).execute()
    sheet_id = None
    for sheet in spreadsheet.get("sheets", []):
        properties = sheet.get("properties", {})
        if properties.get("title") == repo.worksheet_name:
            sheet_id = int(properties["sheetId"])
            break
    if sheet_id is None:
        raise RuntimeError(f"Worksheet not found: {repo.worksheet_name}")

    rows = service.spreadsheets().values().get(
        spreadsheetId=repo.spreadsheet_id,
        range=f"'{repo.worksheet_name}'!A:N",
    ).execute().get("values", [])

    row_numbers_to_delete = []
    for row_number, row in enumerate(rows[1:], start=2):
        if not row:
            continue
        first_cell = str(row[0]).strip().lower()
        if first_cell in {"", "id", "public id", "reminder id"}:
            row_numbers_to_delete.append(row_number)

    for row_number in reversed(row_numbers_to_delete):
        service.spreadsheets().batchUpdate(
            spreadsheetId=repo.spreadsheet_id,
            body={
                "requests": [
                    {
                        "deleteDimension": {
                            "range": {
                                "sheetId": sheet_id,
                                "dimension": "ROWS",
                                "startIndex": row_number - 1,
                                "endIndex": row_number,
                            }
                        }
                    }
                ]
            },
        ).execute()

    print(f"cleanup-ok deleted={len(row_numbers_to_delete)}")


if __name__ == "__main__":
    main()