ai_member_xiaoxi/scripts/fix_all_sheets.py
2026-06-03 08:00:01 +08:00

157 lines
7.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""一次性修复:
1. 每日线索底部加月度合计行
2. 落单渠道分布重构合计在前先总GMV再拆渠道
3. 销转总览 GMV列格式改为金额
4. 过程数据阶段上课人数改为累计口径 + 5月Tom补全
"""
import json, requests, os, time, sys
CRED_DIR = "/root/.openclaw/credentials/xiaoxi"
SPREADSHEET_TOKEN = "NoZqsFi47hIOHEt9j8WcfRtbnug"
def get_token():
with open(os.path.join(CRED_DIR, "config.json")) as f:
cfg = json.load(f)
resp = requests.post(
"https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal",
json={"app_id": cfg["apps"][0]["appId"], "app_secret": cfg["apps"][0]["appSecret"]},
timeout=15)
return resp.json()["tenant_access_token"]
token = get_token()
def write_values(sheet_id, range_str, values):
resp = requests.put(
f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{SPREADSHEET_TOKEN}/values",
headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
json={"valueRange": {"range": range_str, "values": values}},
params={"valueInputOption": "USER_ENTERED"},
timeout=60)
result = resp.json()
ok = result.get("code") == 0
if not ok:
print(f"{range_str}: code={result.get('code')} msg={result.get('msg')}")
else:
print(f"{range_str}")
return ok
# ============================================================
# 1. 每日线索 底部加月度合计行 (row 96-99)
# ============================================================
print("=== 1. 每日线索 月度合计 ===")
monthly_totals = [
["3月合计", '=SUMIF(A2:A95,"3月*",B2:B95)', '=SUMIF(A2:A95,"3月*",C2:C95)',
'=SUMIF(A2:A95,"3月*",D2:D95)', '=SUMIF(A2:A95,"3月*",E2:E95)', '=SUM(F96:I96)'],
["4月合计", '=SUMIF(A2:A95,"4月*",B2:B95)', '=SUMIF(A2:A95,"4月*",C2:C95)',
'=SUMIF(A2:A95,"4月*",D2:D95)', '=SUMIF(A2:A95,"4月*",E2:E95)', '=SUM(F97:I97)'],
["5月合计", '=SUMIF(A2:A95,"5月*",B2:B95)', '=SUMIF(A2:A95,"5月*",C2:C95)',
'=SUMIF(A2:A95,"5月*",D2:D95)', '=SUMIF(A2:A95,"5月*",E2:E95)', '=SUM(F98:I98)'],
["6月合计", '=SUMIF(A2:A95,"6月*",B2:B95)', '=SUMIF(A2:A95,"6月*",C2:C95)',
'=SUMIF(A2:A95,"6月*",D2:D95)', '=SUMIF(A2:A95,"6月*",E2:E95)', '=SUM(F99:I99)'],
]
write_values("1ANW6c", "1ANW6c!A96:F99", monthly_totals)
# ============================================================
# 2. 落单渠道分布重构
# 新布局: 月份 | 销售 | 总GMV | 总订单 | 销转GMV | 销转订单 | 端内GMV | 端内订单 | 直购GMV | 直购订单
# 合计行放在每个月的第一行
# ============================================================
print("\n=== 2. 落单渠道分布重构 ===")
# 先写新表头
new_header = [["月份", "销售", "总GMV", "总订单", "销转渠道-GMV", "销转渠道-订单",
"端内-GMV", "端内-订单", "直购-GMV", "直购-订单"]]
write_values("3dIXcs", "3dIXcs!A1:J1", new_header)
# 新布局: 每个月 合计 → 小龙 → 吴迪 → Bob → Tom
months_list = ["3月", "4月", "5月", "6月"]
all_sales = {
"3月": ["合计", "小龙", "Bob", "Tom"],
"4月": ["合计", "小龙", "吴迪", "Bob", "Tom"],
"5月": ["合计", "小龙", "吴迪", "Bob", "Tom"],
"6月": ["合计", "小龙", "吴迪", "Bob", "Tom"],
}
row_idx = 2
for month in months_list:
for sales in all_sales[month]:
if sales == "合计":
total_gmv = f'=SUMIFS(\'订单汇总\'!G:G,\'订单汇总\'!B:B,"{month}*")'
total_orders = f'=COUNTIFS(\'订单汇总\'!B:B,"{month}*")'
xz_gmv = f'=SUMIFS(\'订单汇总\'!G:G,\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!J:J,"销转")'
xz_orders = f'=COUNTIFS(\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!J:J,"销转")'
dn_gmv = f'=SUMIFS(\'订单汇总\'!G:G,\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!J:J,"端内")'
dn_orders = f'=COUNTIFS(\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!J:J,"端内")'
zg_gmv = f'=SUMIFS(\'订单汇总\'!G:G,\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!J:J,"直购")'
zg_orders = f'=COUNTIFS(\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!J:J,"直购")'
else:
total_gmv = f'=SUMIFS(\'订单汇总\'!G:G,\'订单汇总\'!A:A,"{sales}",\'订单汇总\'!B:B,"{month}*")'
total_orders = f'=COUNTIFS(\'订单汇总\'!A:A,"{sales}",\'订单汇总\'!B:B,"{month}*")'
xz_gmv = f'=SUMIFS(\'订单汇总\'!G:G,\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!A:A,"{sales}",\'订单汇总\'!J:J,"销转")'
xz_orders = f'=COUNTIFS(\'订单汇总\'!A:A,"{sales}",\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!J:J,"销转")'
dn_gmv = f'=SUMIFS(\'订单汇总\'!G:G,\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!A:A,"{sales}",\'订单汇总\'!J:J,"端内")'
dn_orders = f'=COUNTIFS(\'订单汇总\'!A:A,"{sales}",\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!J:J,"端内")'
zg_gmv = f'=SUMIFS(\'订单汇总\'!G:G,\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!A:A,"{sales}",\'订单汇总\'!J:J,"直购")'
zg_orders = f'=COUNTIFS(\'订单汇总\'!A:A,"{sales}",\'订单汇总\'!B:B,"{month}*",\'订单汇总\'!J:J,"直购")'
row = [[month, sales, total_gmv, total_orders, xz_gmv, xz_orders,
dn_gmv, dn_orders, zg_gmv, zg_orders]]
write_values("3dIXcs", f"3dIXcs!A{row_idx}:J{row_idx}", row)
row_idx += 1
time.sleep(0.3)
# 清除旧数据row 20+ 如果有的话)
print(" 清除旧数据行...")
write_values("3dIXcs", "3dIXcs!A21:J30", [[None]*10]*10)
# ============================================================
# 3. 销转总览 GMV列(F) 格式改为金额
# ============================================================
print("\n=== 3. 销转总览 GMV格式 ===")
# 飞书 API 设置单元格格式
resp = requests.put(
f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{SPREADSHEET_TOKEN}/style",
headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
json={
"appendStyle": {
"range": "3fR34k!F2:F20",
"style": {
"formatter": "0.00"
}
}
},
timeout=30)
print(f" GMV格式: code={resp.json().get('code')} msg={resp.json().get('msg')}")
# 也设置 G(退款) H(GSV) I(消耗) J(达人GMV) K(佣金) L(总成本) 为金额格式
for col in ["G", "H", "I", "J", "K", "L"]:
resp = requests.put(
f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{SPREADSHEET_TOKEN}/style",
headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
json={
"appendStyle": {
"range": f"3fR34k!{col}2:{col}20",
"style": {"formatter": "#,##0"}
}
},
timeout=30)
time.sleep(0.2)
# E列(转化率) 百分比格式
resp = requests.put(
f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{SPREADSHEET_TOKEN}/style",
headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
json={
"appendStyle": {
"range": "3fR34k!E2:E20",
"style": {"formatter": "0.00%"}
}
},
timeout=30)
print(f" 转化率格式: code={resp.json().get('code')}")
print("\n✅ 任务1-3完成")
print("任务4-5(过程数据)需要查询数据库,继续执行...")