一键搞定快速操作笔记的元数据并统计最近完成事项

一键搞定快速操作笔记的元数据并统计最近完成事项

读过 PARA 笔记法的朋友们可能会在自己的笔记中记录 Project(工程),当完成一项工程的时候,就会有满满的收获!

但在刚才又一次「完成」了一条笔记的时候,我突发奇想——

怎么让自己的点滴涓流汇聚成河呢?

元数据。

在笔记属性中添加 done 属性,代表这是一个 完成了的项目

再添加一个 finished_date,记录 完成时间

这样一来,可以借助 Dataview 非常方便地统计和回顾——自己这段时间完成了多少项目。

添加元数据

添加属性最简单但是麻烦的方式,就是手动点击「添加文档属性」,然后加上 复选框 类型的 done 属性,以及 日期 类型的 finished_date 属性。

一键搞定快速操作笔记的元数据并统计最近完成事项--添加元数据

然后在做完项目的时候,手动打勾并填写日期。

这样太麻烦了……我们 OB 用户不能忍受这种麻烦的。

一键搞定快速操作笔记的元数据并统计最近完成事项--添加元数据

所以我用 Templater 插件写了个脚本,可以 一键添加完成状态

脚本如下:

<%*
/*
- Author: Moy
- Create Time: 2024-07-30
- Description: 这是一个用来修改当前文件的元数据的范例脚本
- Version: 1.0
*/

// 配置项

// 两个元数据的属性名,一个是 bool 类型(打勾),另一个是日期类型
const propDone = "done";
const propFinishedDay  = "finished_date";
// 这里填写日记的格式
const dateFormat = "YYYY-MM-DD";

const todayDate = moment().format(dateFormat);

// 第一种获得笔记的方法,按照路径匹配,应该会更准确一些
const notePath = tp.file.path(true);  // 这里要使用相对路径,否则下面的函数读取不到的
const fileObj = app.vault.getAbstractFileByPath(notePath);

// 第二种方法,用笔记名匹配
const noteName = tp.file.title;
// const fileObj = tp.file.find_tfile(noteName);

function updateFM( fm ) {
	fm[propDone] = true;
	fm[propFinishedDay] = todayDate;
	new Notice(`你在 ${todayDate} 完成了:\n${noteName}\n恭喜! 🎉`);
}

if (fileObj) {
    app.fileManager.processFrontMatter(fileObj, (fm) => {
        if (fm[propDone]) {
            tp.system.prompt("已存在 Done 属性,是否刷新完成日期?", "是")
                .then((confirm) => {
                    if (confirm == "是") {
                        updateFM(fm);
                    } else {
	                    new Notice("取消更新完成时间");
                    }
                });
        } else {
            updateFM(fm);
        }
    });
}
%>

后续如果有更新会放在:TP Script: Add done and finished date into Frontmatter (Property)

这个脚本就是个模板,按照 TP 通常模板的方式调用即可。

效果演示:

一键搞定快速操作笔记的元数据并统计最近完成事项--添加元数据

统计

使用 Dataview 不但能列出所有「完成了的笔记」,还能计算出这个项目从创建到完成一共精力了多少天,并按照时间先后进行排序。

效果:

一键搞定快速操作笔记的元数据并统计最近完成事项--统计

使用的 Dataview 代码:

TABLE
dateformat(date(file.frontmatter["create_date"]), "yyyy-MM-dd") AS 创建时间,
file.frontmatter["finished_date"] AS 完成时间,
choice(file.frontmatter["finished_date"], round((date(file.frontmatter["finished_date"]) - striptime(date(file.frontmatter["create_date"]))).days) + " 天", "无数据") AS 历经

FROM ""
WHERE done AND finished_date

SORT file.frontmatter["finished_date"] DESC
  • 这里的 create_date 改成你自己的「创建时间」属性名,如果没有的话,可以把 date(file.frontmatter["create_date"]) 替换成 cday,这会使用文本本身的创建日期
  • 同样的,donefinished_date 换成你自己的「完成状态」、「完成时间」属性名

讨论

若阁下有独到的见解或新颖的想法,诚邀您在文章下方留言,与大家共同探讨。



反馈交流

其他渠道

版权声明