SimpleTC プロジェクト別集計2
hh:mm-hh:mm (m) #プロジェクト名 タスク名 プロジェクト名とタスク名の位置は前後する
https://scrapbox.io/files/67ae96c7bb0797dbb288be7d.png
Obsidian
code:js
`dataviewjs
const startDate = moment().subtract(30, "days");
const endDate = moment();
const groupedData = {};
// 過去30日分のYYYY-MM-DD.md形式のファイルを読み込む
for (let d = moment(startDate); d.isSameOrBefore(endDate); d.add(1, "day")) {
let dateStr = d.format("YYYY-MM-DD");
let dayOfWeek = d.format("ddd"); // 曜日 (例: Mon, Tue, Wed)
let filePath = notes/${dateStr}.md;
let fileContent = await dv.io.load(filePath).catch(() => null);
if (!fileContent) continue; // ファイルが存在しない場合はスキップ
for (let line of fileContent.split("\n")) {
// (m) の時間表記に対応
if (!match) {
console.log(No match: ${line});
continue;
} else {
console.log(Matched: ${line});
}
let startTime = match1 ? moment(match1, "HH:mm") : null; let endTime = match2 ? moment(match2, "HH:mm") : null; let manualMinutes = match3 ? parseInt(match3, 10) : 0; // (m) の部分を取得 if (!project) continue; // プロジェクト名がない場合はスキップ
let duration = moment.duration(0);
if (startTime && endTime) {
duration = moment.duration(endTime.diff(startTime));
} else if (manualMinutes > 0) {
duration = moment.duration(manualMinutes, "minutes");
}
let dateKey = [[${dateStr}]] (${dayOfWeek}); // Obsidianのリンク付き日付
}
}
// 出力処理
let output = | 日付 (曜日) | プロジェクト | 合計時間 |\n|------------|------------|----------|\n;
for (let date of Object.keys(groupedData).sort().reverse()) {
for (let project of Object.keys(groupedDatadate)) { let formattedTime = Math.floor(totalMinutes / 60) + ":" + String(totalMinutes % 60).padStart(2, "0");
output += | ${date} | ${project} | ${formattedTime} |\n;
}
}
dv.paragraph(output);
`