Notion记账财务数据分析技能,自动读取收支流水表,全页抓取,100%解析关联字段,按月/类别多维分析,生成Markdown财务报告。
Notion 记账数据分析 Skill是一项面向实际任务的技能,主要用于适用场景:用户说"分析我的 Notion 记账数据"、"生成财务报告"、"查看收支趋势"时触发;前置条件:用户提供 Notion Integration Token(secret_xxx 格式)和 data_source_id;
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
适用场景:用户说"分析我的 Notion 记账数据"、"生成财务报告"、"查看收支趋势"时触发。 前置条件:用户提供 Notion Integration Token(secret_xxx 格式)和 data_source_id。
has_more),不漏任何记录/workspace/,带优化建议| relation ID(前8位) | 对应类别 |
|---|---|
2e1bd123...817c |
房租 |
2e1bd123...80e8 |
旅游娱乐 |
2e1bd123...8081 |
房贷 |
2e1bd123...815a |
餐饮 |
2e1bd123...8004 |
总记账 |
2e1bd123...806f |
医疗 |
2e1bd123...8059 |
购物 |
2e1bd123...80d4 |
所得税 |
2e1bd123...817f |
交通 |
2e1bd123...81dd |
人情往来 |
2e1bd123...8084 |
专项 |
2e1bd123...810d |
运动 |
2e1bd123...8054 |
公司额外 |
2e1bd123...81de |
日用 |
💡 若发现新的 relation ID 查不到名称:在 Notion 中打开该记录页面 → 右上角
...→Add connections→ 添加 Integration 即可。
支出流水表通常有两个分类字段,优先级:
| 字段 | 类型 | 处理方式 |
|---|---|---|
支出类别 |
relation | 通过 API 查询名称,必须 |
标签 |
select | 直接存储名称,可用 |
错误:只用 select,忽略 relation → 类别大量丢失。 正确:relation 用 ID 查表,select 直接用,两者结合覆盖 100% 类别。
用户未提供 data_source_id 时,用搜索接口查找:
curl -s -X POST "https://api.notion.com/v1/search"
-H "Authorization: Bearer $NOTION_API_TOKEN"
-H "Notion-Version: 2025-09-03"
-d '{"query": "支出", "page_size": 20}'
| jq '.results[] | {id, title: .properties.Name.title[0].plain_text}'
// 错误:只查第一页 → 数据不完整
const page = await fetch('/v1/data_sources/{id}/query', {page_size: 100});
// 正确:循环直到 has_more = false
let cursor = null;
do {
const body = cursor ? {page_size:100, start_cursor:cursor} : {page_size:100};
const page = await fetch('/v1/data_sources/{id}/query', body);
results.push(...page.results);
cursor = page.has_more ? page.next_cursor : null;
} while (cursor);
// 第一步:收集所有 relation IDs(不重复) const allIds = [...new Set(results.flatMap(r => (r.properties['支出类别']?.relation || []).map(rel => rel.id) ))]; // 第二步:并发查询所有 ID(每个只查一次) const relMap = Object.fromEntries( await Promise.all(allIds.map(async id => [id, await resolvePageName(id)])) );
# 可直接使用附带的分析脚本 node analyze.mjs[income_data_source_id] [year]
| 现象 | 原因 | 解决方案 |
|---|---|---|
| 类别全是"未分类" | 只用了 select,relation 全部丢失 | 改用 relation ID 查表 |
| 总支出比预期少 | 只查了第一页(100条),还有后续页 | 循环翻页直到 has_more=false |
| relation ID 查不到名称 | 记录不在 integration 可见范围内 | Notion 页面 → Add connections |
| 金额对不上 | select 和 relation 重复计算了同一笔 | select 和 relation 只取一个字段 |
# {年份} 年度财务分析报告
> 数据来源:Notion 支出流水表 & 收入流水表
> 分析范围:{年}年({n}笔支出,{n}笔收入)
## 一、收支总览
## 二、月度趋势
## 三、类别分析(relation 100% 解析)
## 四、标签分析
## 五、TOP N 大额支出
## 六、优化建议
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.5万人学习
最新文章