我想用dataview做一个简单的每周工作时间统计

请仔细说明自己遇到的问题,以下是参考模板。这里不要求非得按模板发帖,但内容中包含相关要素能让大家更好地帮助你。


遇到的问题

我想要用dataview做一个简单的每周工作时间统计,非常简单:
我会在每天的日记中记录今天“工作了几个小时”,“游戏玩了几个小时”,“视频看了几个小时”,“其他事项几个小时”
我会使用元数据,也就是:[[work: 1]][[game: 0.15]][[video: 0.52]]的格式
然后我希望使用dataview配合模板,每周生成一个“每周工作几个小时”,“游戏玩了几个小时”等内容的dataview查询文档,这样每周就能看到时间度过的情况
日记放在Dailynotes文件夹中,日记文件名格式与位置为Dailynotes/yyyy/MM/yyyy-MM-DD

预期的效果

我希望它能表现成下面这个样子:这个例子来自https://zhuanlan.zhihu.com/p/700968386, 表格列求和那段


我不指望完全一样,能满足需求就可以

已尝试的解决方案

我觉得这个应用应该够基础了,但是我转了一圈,没有完美符合要求的。我跟chatgpt和deepseek都问过了,他们给的代码都跑不了,我只能说向人类问问题不丢人。

我感觉最关键的一个坑是 dv 的 inline 属性应该是 [work:: 1] [game:: 0.15] [video:: 0.52]

而不是 [[work: 1]] [[game: 0.15]] [[video: 0.52]] 后者的写法不常见, 需要专门解析, AI 估计不知道怎么抄现成代码

如果改成标准的 dv inline 属性写法, AI 还是基本能写成的
以下绝大部分是 AI 生成的 (也有报错, 原样把报错贴回去让它改), 知识库就只参考了楼主链接里的达人系列前三篇


```dataviewjs
// 初始化统计变量
let totalWork = 0;
let totalGame = 0;
let totalVideo = 0;
let totalOther = 0;

// 初始化数据数组
const data = []; // 确保 data 是一个数组

// 遍历指定文件夹中的所有文件
const pages = dv.pages('"来源日记的路径"').where(page => page.work).sort(p => p.file.name);
// 创建表格数据
const headers = ["日期", "工作", "游戏", "视频", "其他"];
pages.forEach(page => {
  totalWork += page.work || 0;
  totalGame += page.game || 0;
  totalVideo += page.video || 0;
  totalOther += page.other || 0;
  data.push([
    page.file.day, // 日期
    page.work || 0, // 工作时间
    page.game || 0, // 游戏时间
    page.video || 0, // 视频时间
    page.other || 0 // 其他时间
  ]);
});

// 添加总计行
data.push([
  "总计",
  totalWork,
  totalGame,
  totalVideo,
  totalOther
]);

// 渲染表格
dv.table(headers, data);
```

这个倒是能跑,但是我希望它是按周来计算的,我希望他能自动计算一周内的内容而不是指定
我把能找到的示例文档都喂给AI了,结果它还是不行……看来没有符合逻辑的实例,它就生成不了
实在不行我就只能把日记的格式变成以周进行计算的了,这样至少路径就确定了

实在不行我就只能把日记的格式变成以周进行计算的了

不用啊, 接着上面代码继续完善就行了呗
每天数据都有了, 弄个每周报表还不是轻轻松松的事, 且这时不涉及 dv 特殊语法了, 全都是 js 公用的语法, AI 基本不会写错

完工了,感谢支持,我让AI用最直接的指定文件路径的方式来做,它终于成功了。AI喜欢乱使用未定义的函数,他只是单纯的觉得这个逻辑用在这段代码里很合适,不考虑代码本身究竟能不能用,最后可能还是要人类来出主意

// 初始化统计变量
let totalWork = 0;
let totalGame = 0;
let totalVideo = 0;
let totalOther = 0;
const data = [];
// 修改后的文件指定方式(手动添加7天文件路径)
const weekFiles = [
    "DailyNotes/<% tp.date.now("YYYY") %>/<% tp.date.now("MM") %>/<% tp.date.weekday("YYYY-MM-DD", 0) %>",
	"DailyNotes/<% tp.date.now("YYYY") %>/<% tp.date.now("MM") %>/<% tp.date.weekday("YYYY-MM-DD", 1) %>",
	"DailyNotes/<% tp.date.now("YYYY") %>/<% tp.date.now("MM") %>/<% tp.date.weekday("YYYY-MM-DD", 2) %>",
	"DailyNotes/<% tp.date.now("YYYY") %>/<% tp.date.now("MM") %>/<% tp.date.weekday("YYYY-MM-DD", 3) %>",
	"DailyNotes/<% tp.date.now("YYYY") %>/<% tp.date.now("MM") %>/<% tp.date.weekday("YYYY-MM-DD", 4) %>",
	"DailyNotes/<% tp.date.now("YYYY") %>/<% tp.date.now("MM") %>/<% tp.date.weekday("YYYY-MM-DD", 5) %>",
	"DailyNotes/<% tp.date.now("YYYY") %>/<% tp.date.now("MM") %>/<% tp.date.weekday("YYYY-MM-DD", 6) %>",
];

// 修改后的核心代码行
const pages = dv.pages(weekFiles.map(f => `"${f}"`).join(" OR ")).sort(p => p.file.name);

// 构建表格数据(保持原逻辑不变)
pages.forEach(page => {
    totalWork += page.work || 0;
    totalGame += page.game || 0;
    totalVideo += page.video || 0;
    totalOther += page.other || 0;
    
    data.push([
        dv.date(page.file.day).toFormat("yyyy-MM-dd"),
        page.work || 0,
        page.game || 0,
        page.video || 0,
        page.other || 0
    ]);
});

// 添加总计行
data.push(["总计", totalWork, totalGame, totalVideo, totalOther]);

// 渲染表格
dv.table(["日期", "工作", "游戏", "视频", "其他"], data);

2 个赞