Obsidian TaskWizard v4
作成日: 2025/08/26
過去のタスクを検索して追加
開始時刻・終了時刻は除外してタスク一覧を表示
選択した内容をカーソル行にコピぺ
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 タスクリスト or 行頭に何もないプレーン行)
const isChecklist = (line) => /^\s*-*+\s*\[ xX>\-/~?\]\s+/.test(line); const isTaskList = (line) => /^\s*(?:-*+\s+|\d+\.\s+)/.test(line); // 箇条書き or 番号リスト const isPlainLine = (line) => /\S/.test(line) && !isChecklist(line) && !isTaskList(line); // 非空でマーカーなし
const isTargetLine = (line) => isChecklist(line) || isTaskList(line) || isPlainLine(line);
// マーカーと時刻を削除 + ; 以降を除外
const stripMarkersAndTime = (line) =>
line
.replace(
/^\s*(?:-*+\s+|\d+\.\s+)?(?:\[ xX>\-/~?\]\s+)?(?:\d{2}:\d{2}(?:-\d{2}:\d{2})?\s*)?/, ""
)
.replace(/;.*/, "") // ; 以降を削除
.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);
if (cleaned.trim()) { // 空行になった場合は除外
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("選択したタスク・メモを挿入しました。");
}
}
%>