已解决:实现简易的记账功能

我用Memos在日记里记录每天的收支情况,格式如下:记账:: 渠道/类别/金额/明细

2023-5-18 记账:: 线下/交通/-28/打车从A地到B地
2023-5-21 记账:: 淘宝/服饰/-99/牛仔裤
2023-5-21 记账:: 闲鱼/电子产品/150/转让运动手环

希望能在周记里自动汇总该周的收支并生成表格?预期效果如下图:

批注 2023-05-23 001251

我不会编程,有大佬能帮忙实现吗?

chatgpt

我也一直想弄个这种,现在都是在EXCEL上面记,看人家说Notion好用,但是在记笔记比较不放心

这只是一个笔记软件啊 :rofl:
我只知道有插件可以同步Memos到Obsidian。

如果您也是将收支记录放在单独的heading的话,可以直接使用橙猫在用 Obsidian 一年最喜欢的 7 个功能 一文中的代码来实现。

  1. 可以直接使用Obsidian-Memos插件,功能少些,足够了;
  2. Obsidian不只是一个笔记软件啊,请参考橙猫在用 Obsidian 一年最喜欢的 7 个功能 一文中的精彩展示。

感谢分享的文章,作者很厉害,我只实现了其中的卡片功能。
不过看他的记账功能,似乎也没达到你的效果,你可以跟帖跟他交流下。

在我那个基础上,改亿点点可以实现。。但不懂编程就没必要。用custom frame插件嵌入表格类软件(Notion或Flowus或其他Excel类)去记账其实也行的

谢谢指点,您的文章已经给了太多提示啦。我没用过custom frame插件,也不懂Notion和Flowus,还是一点点慢慢学习吧 :sweat_smile:

我试了,和ChatGPT的对话如下。


我使用Obsidian软件记录财务收入和支出,记录格式如下:

  • 日期,来源,类别,金额,明细。

譬如:

  • 2023年5月21日,淘宝,服装,-99元,牛仔裤一条
  • 2023年5月21日,都城,早餐,-20元,皮蛋瘦肉粥
  • 2023年5月22日,都城,早餐,-18元,及第粥

希望在周记里自动汇总该周全部财务收入和支出。请提供dataview和javascript代码。


为了使用dataview和javascript代码来汇总该周的全部财务收入和支出,您需要执行以下步骤:

  1. 确保您已经安装了Obsidian中的Dataview插件。
  2. 将以下代码保存为名为“finance.md”的新笔记,该笔记应包含所有财务记录。

复制代码

# 财务记录

- 2023年5月21日,淘宝,服装,-99元,牛仔裤一条
- 2023年5月21日,都城,早餐,-20元,皮蛋瘦肉粥
- 2023年5月22日,都城,早餐,-18元,及第粥

确保日期格式与您的记录相同,并将每个记录保存为单独的行。

  1. 创建一个新的笔记,例如“本周财务报告.md”。
  2. 在该笔记中添加以下代码:

复制代码

## 本周财务报告

### 总支出:{{sum(file.finance.md.date >= thisWeek.Monday and file.finance.md.date <= thisWeek.Sunday and file.finance.md.amount < 0, file.finance.md.amount)}}
| 日期       | 来源   | 类别 | 金额  | 明细             |
| ---------- | ------ | ---- | ----- | ---------------- |
{{table(file.finance.md.date >= thisWeek.Monday and file.finance.md.date <= thisWeek.Sunday and file.finance.md.amount < 0, file.finance.md.date, file.finance.md.source, file.finance.md.category, file.finance.md.amount, file.finance.md.details)}}

### 总收入:{{sum(file.finance.md.date >= thisWeek.Monday and file.finance.md.date <= thisWeek.Sunday and file.finance.md.amount > 0, file.finance.md.amount)}}
| 日期       | 来源   | 类别 | 金额  | 明细             |
| ---------- | ------ | ---- | ----- | ---------------- |
{{table(file.finance.md.date >= thisWeek.Monday and file.finance.md.date <= thisWeek.Sunday and file.finance.md.amount > 0, file.finance.md.date, file.finance.md.source, file.finance.md.category, file.finance.md.amount, file.finance.md.details)}}

此代码将使用Dataview插件自动计算本周的开始和结束日期,并根据这些日期提取finance.md笔记中的财务记录。它会在笔记中生成两个表格,其中包含本周支出和收入的详细信息,以及本周支出和收入的总数。

请注意,在上述代码中,“finance.md”是您保存财务记录的笔记的名称。如果您使用了不同的笔记名称,请相应调整代码。

  1. 保存并关闭该笔记。切换到“本周财务报告.md”笔记时,在预览模式下查看汇总数据。

希望以上操作可以帮助到您!

1 个赞

我去看橙猫的那个帖子,但是好像他只是进行了一些简单的介绍,虽然提供了相关代码,但是作为一个小白我不太懂,而且我基本上没用过任何插件(较为反感插件,虽然方便,但感觉可能会因为OB版本的更新导致一些问题)。不过学到了一些东西,看他的介绍大致就是用了Dataview插件的数据整理这一类的功能,至于他提供的代码可能需要适配他的文件或标题命名,这点他没具体说,不过我打算自己去了解一下Dataview,学习一下相关代码的编写

基于橙猫的代码,做出了预期效果。谢谢橙猫!

为了省事,在日记和周记的YAML中都设置了weeks标记,周记中只汇总该周所属日记的记账信息。
diary
week

记账信息都记录在日记的Memos标题下,记账信息的格式为"记账/来源/类别/金额/明细/",支出金额记为”-XX“。
memos

效果如下:
report

Dataviewjs 代码如下:

const moneyHeading = ‘Memos’;//记账的heading
const keyWords =“记账”;// 记账标识字符

var p =dv.pages(“#DailyNote”).filter(b=>(b.weeks==dv.current().weeks));
var sumMoney = 0;
var inMoney = 0;
var outMoney = 0;
var pathTemp =“”;

for (let i of p.file.lists){
if(i.section.subpath==moneyHeading){
if(i.text.indexOf(keyWords)==-1){//统计包含记账的序列
delete i.text;
continue;
}
var matchText = i.text.replace(/\s*/g,“”).match(/(?<=/).*?(?=/)/g); // 去除字符串中的空格,然后匹配两侧都是"/"的内容
var curSpend = parseFloat(matchText[2]);
sumMoney += curSpend // 计算总金额
if (curSpend > 0) { inMoney += curSpend } // 计算总收入
if (curSpend < 0) { outMoney += curSpend } // 计算总支出
if(pathTemp!= i.path){//同文件第一个先清0
pathTemp = i.path;
}

	i.source = matchText[0]
	i.kind = matchText[1]
	i.finance = matchText[2]
	i.detail = matchText[3]
}else{
	delete i.text
}

}

p = p.filter(function(b){return b.file.lists.finance.length != 0});

dv.paragraph(“总收入:”+Math.round(inMoney100)/100 +“元,总支出:”+Math.round(outMoney100)/100 +“元,净额:” +Math.round(sumMoney*100)/100 +“元”)

dv.table([“日期”,“来源”, “类别”, “金额”, “明细”], p.sort(b => b.file.name,“desc”).map(b => [b.file.link, b.file.lists.source, b.file.lists.kind, b.file.lists.finance, b.file.lists.detail]))

您好,我那个提问里看到了你的回复,找到了这里,想问下你这个也是每天是一个笔记是吧,我想着是弄一个笔记为一年,然后每天是划分为一级或是二级标题这样

我用memos输入,每天自动新建一个笔记,需要汇总时稍微修改一下dataview里的代码,设定汇总时间段就可以。好像还有插件能够合并笔记,也比较方便生成合订本。

如果把一年的记录记在一起,需要时再从里面提取,代码会很复杂吧。再说,一年下来,记录会不会太长、标题会不会太多?

如果只是用来记账的话,已经有专门记账的插件了。

好的,感谢回复,我已经在研究其他记账软件了。。。