Quote:
Originally Posted by imarsman
You can only export the whole project from what I can see
|
FWIW the following script will copy to the clipboard (in TaskPaper format):
- Any task(s) selected in the OF content panel.
- All the children and descendants thereof.
(i.e. if you select a parent, there is no need to select its children).
Code:
-- Copies to clipboard a Taskpaper version of whatever is displayed and selected in right-hand content panel
property pblnToMail : false
on run
tell application "OmniFocus"
tell default document
if number of document window is 0 then
make new document window with properties {bounds:{0, 0, 1000, 500}}
end if
end tell
tell document window 1 of front document
set lstTrees to selected trees of content
if (count of lstTrees) = 0 then
try
display dialog "Nothing selected in the right-hand panel." & return & return & "Select material to export, and try again." & return
end try
else
-- Generate a TaskPaper string of the selected content
set blnContext to (selected view mode identifier is not equal to "project")
set lngIndent to 0
set strTP to my ExportTrees(lstTrees, lngIndent, blnContext)
set the clipboard to strTP
end if
end tell
end tell
end run
on ExportTrees(lstTrees, lngIndent, blnContextView)
-- if the tree is a task give full detail
-- else just name and any note
set strTP to ""
set strIndent to ""
repeat lngIndent times
set strIndent to strIndent & tab
end repeat
tell application "OmniFocus"
repeat with oTree in lstTrees
set oValue to value of oTree
set clValue to class of oValue
if clValue ≠ item then
set strName to name of oValue
if length of strName > 0 then set strName to my EscAmpersand(strName)
set strNote to note of oValue
if length of strNote > 0 then set strNote to my EscAmpersand(strNote)
else
set strName to ""
set strNote to ""
end if
if (clValue is not equal to task) and (clValue is not equal to inbox task) then
-- Project or Folder
if clValue is not equal to folder then
if clValue is not equal to project then
--Inbox (No details)
set oWin to first document window of front document
set strName to name of first selected tree of (sidebar of oWin)
if strName ≠ "Inbox" then set strName to ""
set strTP to strTP & strName & ":" & return
else
-- Project (Name and possibly note)
if length of strName > 0 then
set strTP to strTP & strIndent & strName & ":" & return
if length of strNote > 0 then ¬
set strTP to strTP & strIndent & strNote & return
end if
end if
else
-- Folder (Just name - no note)
set strTP to strTP & strIndent & strName & ":" & return
end if
else -- Task (with details from specified columns)
-- set recFields to {fldName:name of oValue, fldNote:note of oValue, fldDone:completed of oValue, fldContext:strContext, fldStartDate:start date of oValue, flddueDate:due date of oValue, fldDoneDate:completion date of oValue, fldDuration:estimated minutes of oValue, fldFlagged:flagged of oValue}
-- write first line of task, followed by tags
set lstLines to paragraphs of strName
set strTP to strTP & strIndent & "- " & item 1 of lstLines
-- Add any tags
set oContext to context of oValue
if oContext is not equal to missing value then ¬
set strTP to strTP & " @" & name of oContext
set dteStart to start date of oValue
if dteStart is not equal to missing value then ¬
set strTP to strTP & " @start(" & my DateString(dteStart) & ")"
set dteDue to due date of oValue
if dteDue is not equal to missing value then ¬
set strTP to strTP & " @due(" & my DateString(dteDue) & ")"
set lngDurn to estimated minutes of oValue
if lngDurn is not equal to missing value then ¬
set strTP to strTP & " @mins(" & (lngDurn as string) & ")"
if flagged of oValue then set strTP to strTP & " @flag"
if completed of oValue then set strTP to strTP & " @done"
set strTP to strTP & return
-- write any remaining lines of task as note text
if length of lstLines > 1 then
repeat with strLine in rest of lstLines
set strLine to my RTrim(strLine)
if length of strLine > 0 then
-- change any trailling : to :-, to avoid misinterpretation as a header
if last character of strLine ≠ ":" then
set strTP to strTP & strIndent & strLine & return
else
set strTP to strTP & strIndent & strLine & "-" & return
end if
end if
end repeat
end if
-- append any attached note text
set lstLines to paragraphs of strNote
repeat with strLine in lstLines
set strLine to my RTrim(strLine)
if length of strLine > 0 then
-- change any trailling : to :-
if last character of strLine ≠ ":" then
set strTP to strTP & strIndent & strLine & return
else
set strTP to strTP & strIndent & strLine & "-" & return
end if
end if
end repeat
end if
-- if the current node has sub-trees then recurse
set lstSubTrees to trees of oTree
if (count of lstSubTrees) > 0 then
set lngNewIndent to lngIndent + 1
set strTP to strTP & my ExportTrees(lstSubTrees, lngNewIndent, blnContextView)
end if
end repeat
end tell
return strTP
end ExportTrees
on RTrim(someText)
local someText
repeat until someText does not end with return
if length of someText > 1 then
set someText to text 1 thru -2 of someText
else
set someText to ""
end if
end repeat
return someText
end RTrim
on DateString(dte)
-- yyyy-mm-dd hh:mm
set strDate to ""
if dte is not equal to missing value then
set lngMonth to month of dte as integer
set strMonth to lngMonth as string
if lngMonth < 10 then set strMonth to "0" & strMonth
set lngDay to day of dte as integer
set strDay to lngDay as string
if lngDay < 10 then set strDay to "0" & strDay
set strDate to strDate & (year of dte) & "-" & strMonth & "-" & strDay
set lngHrs to (hours of dte) as integer
set lngmins to (minutes of dte) as integer
if (lngHrs > 0) or (lngmins > 0) then
set strHrs to lngHrs as string
if lngHrs < 10 then set strHrs to "0" & strHrs
set strMins to lngmins as string
if lngmins < 10 then set strMins to "0" & strMins
set strDate to strDate & " " & strHrs & ":" & strMins
end if
end if
return strDate
end DateString
on EscAmpersand(str)
set strOldDelim to text item delimiters
set text item delimiters to " @"
set lstParts to text items of str
set lngParts to count of lstParts
if lngParts > 1 then
set strNew to item 1 of lstParts
repeat with n from 2 to lngParts
set strNew to strNew & "_@" & item n of lstParts
end repeat
set text item delimiters to strOldDelim
return strNew
else
set text item delimiters to strOldDelim
return str
end if
end EscAmpersand