Guest
2010-02-27, 09:11 AM
Here is an illustrative first draft of an applescript which exports whatever is selected in OmniFocus over into the current OmniPlan document (or a fresh OmniPlan document if none is selected).
This draft exports name, note, start date, due date, estimated minutes, and done, which is translated to Completed=1 in OP.
Note that the whole sub-tree of the currently selected folder(s), projects(s) and/or task(s) is transferred, so only parent elements need to be selected in the OF interface. (Selecting both parents and their children will cause duplication).
Code:
-- Illustrative draft Ver 0.7
-- Copies anything selected in Omnifocus (Project or Context View) into Omniplan
-- Note that the whole sub-tree is copied, so only 'parent' elements need to be selected.
-- The destination is the currently open OmniPlan document.
-- (A fresh OmniPlan document is created if none is open)
property pPROJECT : "project"
property pTASK : "task"
property pITEM : "item"
on run
set {lstActivities, blnContext} to SelectedInOF()
PlaceinOP(lstActivities)
end run
-- TRANSFERRING TO OMNIPLAN
on PlaceinOP(lstTasks)
if (length of lstTasks > 0) then
tell application id "OPla"
if (count of documents) < 1 then
set oDoc to make new document
else
set oDoc to front document
end if
my PlaceTasks(lstTasks, oDoc)
end tell
end if
end PlaceinOP
on PlaceTasks(lstTasks, oParent)
tell application id "OPla"
tell oParent
repeat with oTask in lstTasks
set {strName, blnDone, lstSubTasks, strNote, strParent, dteStart, dteDue, dteDone, lngMins, blnFlagged} to oTask
if length of strNote > 0 then
set oOPTask to make new task with properties {name:strName, note:strNote}
else
set oOPTask to make new task with properties {name:strName}
end if
tell oOPTask
if dteStart is not equal to missing value then set starting date to dteStart
if dteDue is not equal to missing value then set ending date to dteDue
if lngMins > 0 then
set duration to lngMins * 60
end if
if blnDone then set completed to 1
end tell
if length of lstSubTasks > 0 then
my PlaceTasks(lstSubTasks, oOPTask)
end if
end repeat
end tell
end tell
end PlaceTasks
-- READ SELECTED OmniFocus CONTENT TREE(S) TO NESTED APPLESCRIPT LISTS - Ver.02
on SelectedInOF()
tell application id "OFOC"
set oWin to front window
set blnContext to ((selected view mode identifier) of oWin is not equal to pPROJECT)
tell content of oWin
set lstContentSeln to selected trees
if (count of lstContentSeln) > 0 then -- Whatever is SELECTED in content panel
set lstTrees to lstContentSeln
set blnAll to false
else -- EVERYTHING in the content panel
set lstTrees to trees
set blnAll to true
end if
end tell
{my Trees2List(oWin, lstTrees, blnContext, blnAll), blnContext}
end tell
end SelectedInOF
on Trees2List(oWin, lstTrees, blnContext, blnAll)
set lstTasks to {}
tell application id "OFOC"
repeat with oNode in lstTrees
set oValue to value of oNode
set cClass to class of oValue
if cClass is not item then
if cClass is project then
set end of lstTasks to my ListProject(oNode, oValue, blnContext, blnAll)
else if cClass is task then
set end of lstTasks to my ListTask(oNode, blnContext, blnAll)
else
set end of lstTasks to my ListContext(oNode, oValue, blnAll)
end if
else
set end of lstTasks to my ListUnProcessed(oNode, oValue, blnContext, blnAll)
end if
end repeat
end tell
lstTasks
end Trees2List
on ListProject(oNode, oValue, blnContext, blnAll)
tell application id "OFOC"
tell oNode
set lstChildren to trees of oNode
tell oValue
if (count of lstChildren) > 0 then
{name, completed, my ListSubTrees(lstChildren, blnContext, blnAll), note, "", start date, due date, completion date, estimated minutes, flagged}
else
{name, completed, {}, note, "", start date, due date, completion date, estimated minutes, flagged}
end if
end tell
end tell
end tell
end ListProject
on ListContext(oNode, oValue, blnAll)
tell application id "OFOC"
tell oNode
set lstChildren to trees
set oValue to value of oNode
tell oValue
if (count of lstChildren) > 0 then
{name, false, my ListSubTrees(lstChildren, true, blnAll), note, "", missing value, missing value, missing value, 0, false}
else
{name, false, {}, note, "", missing value, missing value, missing value, 0, false}
end if
end tell
end tell
end tell
end ListContext
on ListUnProcessed(oNode, oValue, blnContext, blnAll)
tell application id "OFOC"
tell oNode
set lstChildren to trees
if blnContext then
set strName to "No Context"
else
set strName to "Inbox"
end if
tell oValue
if (count of lstChildren) > 0 then
{strName, false, my ListSubTrees(lstChildren, blnContext, blnAll), "", "", missing value, missing value, missing value, 0, false}
else
{strName, false, {}, "", "", missing value, missing value, missing value, 0, false}
end if
end tell
end tell
end tell
end ListUnProcessed
on ListSubTrees(lstTrees, blnContext, blnAll)
set lstTasks to {}
repeat with oNode in lstTrees
set end of lstTasks to my ListTask(oNode, blnContext, blnAll)
end repeat
return lstTasks
end ListSubTrees
on ListTask(oNode, blnContext, blnAll)
tell application id "OFOC"
tell oNode
set oTask to value of oNode
set lstSubTrees to trees of oNode
end tell
if blnContext then
set oParent to containing project of oTask
else
set oParent to context of oTask
end if
if oParent is not missing value then
set strParent to name of oParent
else
set strParent to ""
end if
tell oTask
if (count of lstSubTrees) > 0 then
{name, completed, my ListSubTrees(lstSubTrees, blnContext, blnAll), note, strParent, start date, due date, completion date, estimated minutes, flagged}
else
{name, completed, {}, note, strParent, start date, due date, completion date, estimated minutes, flagged}
end if
end tell
end tell
end ListTask
Last edited by RobTrew; 2011-05-19 at 02:48 AM..
Reason: Ver 0.7 quick fix for export of estimated minutes to durations
|