# TTSHOP 同步脚本 `sync.py` 使用 Python 标准库和 `requests` 读取公开 Google Sheets 工作簿,并把所有工作表合并成一个 UTF-8 HTML 表格,固定写入 `data/merged.html`。工作表名称和顺序来自 XLSX 导出,单元格使用公开 gviz 接口返回的显示值。 合并规则:每张表第一行是标题;列按首次出现顺序取并集;源表已有的 `LinkName` 会改名为 `LinkName_Source`、`LinkName_Source_2` 等并保留;脚本最后追加生成的 `LinkName` 列。HTML 文本会进行转义。内容没有变化时不产生 Git 提交,变化时只提交 `data/merged.html` 并推送到 `main`。 ## 本地运行 ```sh python -m pip install -r requirements.txt python sync.py ``` 脚本默认使用固定工作簿 ID `1DPbdVsX3SG_kgDXs2j34mDAgplRSfcAWKKG9yqalFmw`、仓库 `ttshop`、分支 `main` 和输出路径 `data/merged.html`。本地运行需要当前目录是该仓库,并且 Git 已配置可推送的 `origin`;不要把凭据写入 remote URL。 ## 环境变量 - `GIT_CREDENTIAL_SECRET`:可选的 Git 密码/token。脚本通过临时 `GIT_ASKPASS` 使用,不写入 URL、日志或提交文件。 - `GITEA_OWNER`:Git askpass 的用户名提示值;workflow 从仓库变量注入。 - `GITEA_BASE_URL`:Gitea 地址,作为 workflow 配置保留;实际推送使用 checkout 提供的 `origin`。 - `SYNC_FAILURE_WEBHOOK_URL`:可选的失败通知 URL。失败时最多发送一次简短通知,通知失败不会覆盖原始异常。 ## Gitea Actions `.gitea/workflows/sync.yml` 每天执行一次 `0 19 * * *`(按 UTC 解释时为 Asia/Shanghai 次日 03:00),也支持手动触发。workflow 只安装 `requirements.txt` 中的 `requests` 并运行 `python sync.py`,不依赖包 CLI、测试 extras、runner、scheduler 或报告系统。