【半解决】如何在 Bases 展示代办事项

遇到的问题

我使用了obsidian中calendar Bases ,我想将我日记笔记中的代办事项展示在calendar Bases中,但是好像只能获取笔记属性的值,应该怎么处理呢,别的bases视图展示也可以。就想把数据一条条列出来。

预期的效果

这个calendar bases官方说是致谢了full calendar
我也想要这种效果,就是每天的待办是一点点列出来的

已尝试的解决方案

还有别的方法是新建一个事项,加上日期,就可以显示在那一天,但那样会一个代办事项就要建立一个文件,不太想要那种,只想是在一个笔记里面列出四五条代办事项,然后通过获取这个文件展示出来。


目前使用了template插件在日记笔记里面筛选未完成事项和已完成事项,拼接展示在笔记属性里面,在bases用公式渲染出来,(每次需要手动更新一下日记笔记的笔记属性)

看了好多方法都是说不支持读取文件内容。如果有更好的方法欢迎讨论,特别是怎么让脚本在切换文件或者关闭文件自动运行,或许有更便捷的方式。

下面是实现代码

template里面的文件:

<%*
// 获取当前文件对象
const file = tp.file.find_tfile(tp.file.path(true));

// 读取文件内容(用于扫描任务)
const content = await app.vault.read(file);

// 匹配所有任务行
const taskLines = content.match(/- \[[ x]\] .+/g) || [];

// 分类处理:分别收集未完成和已完成的任务内容(去除标签)
const pendingTasks = [];
const completedTasks = [];

taskLines.forEach(line => {
    // 去掉任务标记前缀
    let text = line.replace(/^- \[[ x]\] /, '').trim();
    // 去除所有标签(#开头,直到遇到空格或行尾),包括中文标签
    text = text.replace(/#[^\s]+/g, '').replace(/\s+/g, ' ').trim();
    
    if (line.includes('- [ ]')) {
        if (text.length > 0) pendingTasks.push(text);
    } else if (line.includes('- [x]')) {
        if (text.length > 0) completedTasks.push(text);
    }
});

// 统计
const totalTasks = taskLines.length;
const completedCount = completedTasks.length;
const pendingCount = pendingTasks.length;

// 拼接字符串(可自定义分隔符)
const pendingJoined = pendingTasks.join(' + ');
const completedJoined = completedTasks.join(' + ');

// 使用 processFrontMatter 更新 frontmatter(自动保留原有字段)
await app.fileManager.processFrontMatter(file, (frontmatter) => {
    frontmatter.tasks_completed = completedCount;
    frontmatter.tasks_pending = pendingCount;
    frontmatter.tasks_progress = totalTasks > 0 ? Math.round(completedCount / totalTasks * 100) : 0;
    frontmatter.pending_tasks = pendingJoined;
    frontmatter.completed_tasks = completedJoined;
});

new Notice(`✅ 任务已更新:未完成 ${pendingCount} 项,已完成 ${completedCount} 项`);
%>

日记里面的文件

---
date: 2026-03-09
color:
tasks_total: 2
tasks_completed: 2
tasks_progress: 100
completed_tasks: 跑步 + 水彩
---
- [x] 跑步 #运动
- [x] 水彩 #画画 

bases公式编辑 已完成

if(note.completed_tasks, 
   html("<ul style='margin:0; padding:0; list-style:none;'>"+note.completed_tasks.split("+").map("<li style='margin:2px 0; padding:0; display:flex; align-items:center;'>"+"<div style='height:5px;width:5px;background-color: var(--FoldQ);border-radius: 8px;flex-shrink: 0;'></div><div style='text-decoration:line-through;color:var(--code-punctuation);margin-left:3px; white-space: normal; '>" +value.trim() + "</div>"+ "</li>").join("")+"</ul>"), "")

bases公式编辑 未完成

if(note.pending_tasks, 
   html("<ul style='margin:0; padding:0; list-style:none;'>"+note.pending_tasks.split("+").map("<li style='margin:2px 0; padding:0; display:flex; align-items:center;'>"+"<div style='height:5px;width:5px;background-color: var(--FoldQ);border-radius: 8px; flex-shrink: 0;'></div><span style='color:var(--code-punctuation);margin-left:3px; white-space: normal; '>" +value.trim() + "</span>"+ "</li>").join("")+"</ul>"), "")

蹲一蹲
或许可以尝试让ai写dataview代码?把代办事项在日历视图中列出
dv是可以写出日历视图的:
【Obsidian自制日历表,可见即可得,使用的插件是dataview】 https://www.bilibili.com/video/BV1Yr4y197Kt/?share_source=copy_web&vd_source=1ba216c792d5907ea3a6abd4dca02d0f


另外,你提到的calenda Bases是单独的插件(搜索名字没找到)还是更新了Obsidian后bases有日历视图了 :heart_eyes_cat:

好的谢谢,还是比较喜欢bases这个视图,这个calendar bases是测试版,需要下载BRAT,在BRAT中引入calendar bases的github地址GitHub - edrickleong/obsidian-calendar-bases · GitHub