TaskWizard v3
2025/08/12
完了タスクに対応
過去タスクの検索
code:js
<%*
const maxDaysToSearch = 30; // 最大検索日数
const maxTasksToFind = 100; // 最大取得件数
// ユーザーに検索キーワードを入力させる
const keywordsInput = await tp.system.prompt("検索キーワードを入力(スペース区切りでAND検索)");
if (!keywordsInput) {
new Notice("検索キーワードが入力されませんでした。");
return;
}
const keywords = keywordsInput.split(/\s+/);
// 現在のカーソル位置を取得
const cursorPos = app.workspace.activeEditor.editor.getCursor();
const currentFile = app.workspace.getActiveFile();
if (!currentFile) {
new Notice("ファイルが開かれていません。");
return;
}
// 対象行かどうかを判定(チェックリスト or タスクリスト)
const isChecklist = (line) => /^\s*-*+\s*\[ xX>\-/~?\]\s+/.test(line); const isTaskList = (line) => /^\s*(?:-*+\s+|\d+\.\s+)/.test(line); // 箇条書き or 番号リスト const isTargetLine = (line) => isChecklist(line) || isTaskList(line);
// マーカー(箇条書きやチェックボックス)+先頭時刻を削除
const stripMarkersAndTime = (line) =>
line
.replace(
/^\s*(?:-*+\s+|\d+\.\s+)?(?:\[ xX>\-/~?\]\s+)?\d{2}:\d{2}(?:-\d{2}:\d{2})?\s*/, ""
)
.trimEnd();
let foundItems = [];
let checkedDates = new Set();
let today = new Date();
for (let i = 0; i < maxDaysToSearch && foundItems.length < maxTasksToFind; i++) {
let searchDate = new Date(today);
searchDate.setDate(today.getDate() - i);
let dateString = searchDate.toLocaleDateString('sv-SE'); // YYYY-MM-DD
if (checkedDates.has(dateString)) continue;
checkedDates.add(dateString);
const dailyNote = await tp.file.find_tfile(${dateString}.md);
if (!dailyNote) continue;
const noteContent = await app.vault.read(dailyNote);
const lines = noteContent.split("\n").reverse(); // 直近ほど上
for (const line of lines) {
if (!isTargetLine(line)) continue;
if (!keywords.every(k => line.toLowerCase().includes(k.toLowerCase()))) continue;
const cleaned = stripMarkersAndTime(line);
foundItems.push(cleaned);
if (foundItems.length >= maxTasksToFind) break;
}
}
// 検索結果のリストを表示
if (foundItems.length === 0) {
new Notice("該当するタスクやメモが見つかりませんでした。");
} else {
const selectedItems = await tp.system.suggester(foundItems, foundItems);
if (selectedItems) {
const editor = app.workspace.activeEditor.editor;
editor.replaceRange(selectedItems, cursorPos);
const newCursorPos = { line: cursorPos.line, ch: cursorPos.ch + selectedItems.length };
editor.setCursor(newCursorPos);
new Notice("選択したタスク・メモを挿入しました。");
}
}
%>