109 lines
3.2 KiB
JavaScript
109 lines
3.2 KiB
JavaScript
#!/usr/bin/env osascript -l JavaScript
|
|
|
|
// Update any task with project, tags, due date
|
|
// Usage: osascript -l JavaScript update_task.js '{"name":"Task name","project":"Project Name","tags":["Tag1"],"dueDate":"2025-11-28","deferDate":"2025-01-28"}'
|
|
// Can also use "id" instead of "name" to find task by ID
|
|
|
|
function run(argv) {
|
|
const app = Application('OmniFocus');
|
|
app.includeStandardAdditions = true;
|
|
const doc = app.defaultDocument;
|
|
|
|
let input;
|
|
try {
|
|
input = JSON.parse(argv[0]);
|
|
} catch (e) {
|
|
return JSON.stringify({
|
|
success: false,
|
|
error: "Invalid JSON input"
|
|
});
|
|
}
|
|
|
|
const taskId = input.id;
|
|
const taskName = input.name;
|
|
const projectName = input.project;
|
|
const tagNames = input.tags || [];
|
|
const dueDateStr = input.dueDate;
|
|
const deferDateStr = input.deferDate;
|
|
|
|
if (!taskName && !taskId) {
|
|
return JSON.stringify({
|
|
success: false,
|
|
error: "Task name or id is required"
|
|
});
|
|
}
|
|
|
|
try {
|
|
// Find the task - search all tasks, not just inbox
|
|
let tasksRef;
|
|
if (taskId) {
|
|
tasksRef = doc.flattenedTasks.whose({id: taskId});
|
|
} else {
|
|
tasksRef = doc.flattenedTasks.whose({name: taskName});
|
|
}
|
|
const tasks = tasksRef();
|
|
|
|
if (tasks.length === 0) {
|
|
return JSON.stringify({
|
|
success: false,
|
|
error: "Task not found: " + (taskId || taskName)
|
|
});
|
|
}
|
|
const task = tasks[0];
|
|
|
|
// Set dates if provided
|
|
if (dueDateStr) {
|
|
task.dueDate = new Date(dueDateStr);
|
|
}
|
|
if (deferDateStr) {
|
|
task.deferDate = new Date(deferDateStr);
|
|
}
|
|
|
|
// Move to project if specified
|
|
let targetLocation = "Inbox";
|
|
if (projectName) {
|
|
const projectsRef = doc.flattenedProjects.whose({name: projectName});
|
|
const projects = projectsRef();
|
|
if (projects.length === 0) {
|
|
return JSON.stringify({
|
|
success: false,
|
|
error: "Project not found: " + projectName
|
|
});
|
|
}
|
|
task.assignedContainer = projects[0];
|
|
targetLocation = projectName;
|
|
}
|
|
|
|
// Add tags (preserves existing tags)
|
|
const addedTags = [];
|
|
for (const tagName of tagNames) {
|
|
const tags = doc.flattenedTags.whose({name: tagName});
|
|
if (tags.length > 0) {
|
|
app.add(tags[0], {to: task.tags});
|
|
addedTags.push(tagName);
|
|
}
|
|
}
|
|
|
|
// Get all current tags on task
|
|
const allTags = task.tags().map(function(t) { return t.name(); });
|
|
|
|
return JSON.stringify({
|
|
success: true,
|
|
task: {
|
|
id: task.id(),
|
|
name: task.name(),
|
|
project: targetLocation,
|
|
tags: allTags,
|
|
dueDate: dueDateStr || null,
|
|
deferDate: deferDateStr || null
|
|
}
|
|
});
|
|
|
|
} catch (e) {
|
|
return JSON.stringify({
|
|
success: false,
|
|
error: "Failed to update task: " + e.message
|
|
});
|
|
}
|
|
}
|