タスクを翌日に移動3
2025/02/17
複数行対応
1Writer, Obisidan
1Writer
選択した範囲が含む行全てを処理
code:js
var dir = 'Dropbox/vault/private/notes/';
// 1. 選択した複数行のテキストを取得
const cursorRange = editor.getSelectedLineRange();
const selectedText = editor.getTextInRange(cursorRange0, cursorRange1);
let selectedTasks = selectedText.trim().split("\n").filter(line => line.trim());
// 空行または無効なタスクの場合は処理を終了
if (selectedTasks.length === 0) {
ui.hudError("タスクが選択されていません");
return;
}
// 2. 選択範囲を削除(改行も含めて削除)
const start, end = cursorRange;
editor.replaceTextInRange(start, end + 1, "");
editor.setSelectedRange(start);
// 3. 現在のノートのファイル名から日付を取得
const fileName = editor.getFileName();
const dateMatch = fileName.match(/(\d{4})-(\d{2})-(\d{2})/);
if (!dateMatch) {
ui.hudError("ファイル名から日付を取得できませんでした。");
return;
}
// 移動元の日付を取得
let year = parseInt(dateMatch1, 10);
let month = parseInt(dateMatch2, 10) - 1; // JavaScriptの月は0始まり
let day = parseInt(dateMatch3, 10);
let currentFileDate = new Date(year, month, day);
// 現在の日付(今日)を取得
let today = new Date();
today.setHours(0, 0, 0, 0); // 時刻をリセット
// 移動先の日付を決定
let targetDate;
if (currentFileDate < today) {
// **過去の日付なら今日に移動**
targetDate = today;
} else {
// **今日または未来なら翌日に移動**
targetDate = new Date(currentFileDate);
targetDate.setDate(targetDate.getDate() + 1);
}
// 移動先の日付をフォーマット
let targetYear = targetDate.getFullYear();
let targetMonth = ("0" + (targetDate.getMonth() + 1)).slice(-2);
let targetDay = ("0" + targetDate.getDate()).slice(-2);
let targetDateString = ${targetYear}-${targetMonth}-${targetDay};
// 4. 各タスクをフォーマットして移動先に追加
let formattedTasks = selectedTasks.map(task => formatTask(task, dateMatch0)).join("\n");
let targetFileName = ${dir}${targetDateString}.md;
// 5. URLスキームを使って、移動先のノートにタスクを追記
let textToAppend = encodeURIComponent(formattedTasks);
let urlScheme = onewriter://x-callback-url/append?path=${encodeURIComponent(targetFileName)}&text=${textToAppend};
app.openURL(urlScheme);
// 6. 完了ポップアップ
ui.hudSuccess(タスクを ${targetDateString} に移動しました。);
// 7. タスクのフォーマット関数
function formatTask(task, currentDate) {
let match = task.match(/^(\s*- \.\|\s*-|\s*\d+\.)?\s*(.+)/);
if (!match) return task;
let prefix = match1 || "-";
let taskName = match2;
if (!taskName.match(/\[\\d{4}-\d{2}-\d{2}\\]/)) {
taskName = [[${currentDate}]] + taskName;
}
return ${prefix} ${taskName};
}
Obsidian
カーソルがあっている行をコピー(単一行)
選択範囲をコピー(複数行)
code:js
<%*
const dir = "notes/"; // ノートの保存ディレクトリ
// 1. エディタの取得
const editor = app.workspace.activeEditor?.editor;
if (!editor) {
new Notice("エディタが開かれていません");
return;
}
// 2. カーソル範囲にあるすべての行を取得
let selectedText = editor.getSelection().trim();
if (!selectedText) {
// 選択範囲がない場合、カーソルがある行を取得
const cursor = editor.getCursor();
selectedText = editor.getLine(cursor.line).trim();
}
let selectedTasks = selectedText.split("\n").filter(line => line.trim());
// 空行または無効なタスクの場合は処理を終了
if (selectedTasks.length === 0) {
new Notice("タスクが選択されていません");
return;
}
// 3. 選択範囲またはカーソル行を削除
if (editor.getSelection()) {
editor.replaceSelection("");
} else {
const cursor = editor.getCursor();
editor.replaceRange("", { line: cursor.line, ch: 0 }, { line: cursor.line + 1, ch: 0 });
}
// 4. 現在のノートのファイル名から日付を取得
const activeFile = app.workspace.getActiveFile();
if (!activeFile) {
new Notice("アクティブなノートが見つかりません");
return;
}
const fileName = activeFile.basename;
const dateMatch = fileName.match(/(\d{4})-(\d{2})-(\d{2})/);
if (!dateMatch) {
new Notice("ファイル名から日付を取得できませんでした。");
return;
}
// 移動元の日付を取得
let year, month, day = dateMatch;
let currentFileDate = new Date(year, month - 1, day);
// 現在の日付(今日)を取得
let today = new Date();
today.setHours(0, 0, 0, 0); // 時刻をリセット
// 移動先の日付を決定
let targetDate;
if (currentFileDate < today) {
// **過去の日付なら今日に移動**
targetDate = today;
} else {
// **今日または未来なら翌日に移動**
targetDate = new Date(currentFileDate);
targetDate.setDate(targetDate.getDate() + 1);
}
// 移動先の日付をフォーマット
let targetYear = targetDate.getFullYear();
let targetMonth = String(targetDate.getMonth() + 1).padStart(2, "0");
let targetDay = String(targetDate.getDate()).padStart(2, "0");
let targetDateString = ${targetYear}-${targetMonth}-${targetDay};
let targetFilePath = ${dir}${targetDateString}.md;
// 5. 各タスクをフォーマットして移動先に追加
let formattedTasks = selectedTasks.map(task => formatTask(task, dateMatch0)).join("\n");
// 6. ノートの更新
let targetFile = app.vault.getAbstractFileByPath(targetFilePath);
if (targetFile) {
// ファイルが存在する場合、テキストを追記
await app.vault.append(targetFile, '\n' + formattedTasks);
new Notice(タスクを ${targetDateString} に移動しました。);
} else {
// ファイルが存在しない場合は新規作成
await app.vault.create(targetFilePath, '\n' + formattedTasks);
new Notice(新しいノート (${targetDateString}) が作成され、タスクを追加しました。);
}
// 7. タスクのフォーマット関数
function formatTask(task, currentDate) {
let match = task.match(/^(\s*- \.\|\s*-|\s*\d+\.)?\s*(.+)/);
if (!match) return task;
let prefix = match1 || "-";
let taskName = match2;
if (!taskName.match(/\[\\d{4}-\d{2}-\d{2}\\]/)) {
taskName = [[${currentDate}]] + taskName;
}
return ${prefix} ${taskName};
}
%>