View Single Post
Here's a rough starting point. Put as many comma-separated values in the pReviewIntervals list as you like; those are the numbers of days until each copy of the source action(s) is added to the project specified in the pReviewProject property. By default, you get 2 days from the start date to the due date, but that can be configured in 24 hour increments. The script now uses the default due time setting from OmniFocus.

This has gotten the amount of testing you might expect from the compensation package we agreed upon :-)

If you need help installing this, see RobTrew's excellent FAQ. Thanks also to RobTrew for enlightening me on how to elicit the default due time from OmniFocus.

Code:
-- Ebbinghaus review scheduler
-- schedules tasks for reviewing learned material in spirit of Ebbinghaus forgetting curves
-- Bill Palmer, February 2013

property pReviewProject : "Review" -- name of project which will receive tasks
property pReviewIntervals : {3, 3 * 7, 3 * 30, 365, 2 * 365} -- number of days before each repeat, augment as desired
property pReviewDaysUntilDue : 2 -- allow two days after start date for completion
property pAutoSave : false -- set this to false for faster performance but slightly more risk

on GetDefaultDueTime()
	tell application id "OFOC" to tell front document to set timeStr to value of setting id "DefaultDueTime"
	set {otid, text item delimiters} to {text item delimiters, ":"}
	set {dueHour, dueMin, dueSec, text item delimiters} to every text item in timeStr & otid
	return (((dueHour * 60) + dueMin) * 60 + dueSec)
end GetDefaultDueTime

on ProcessAction(selAction, dstProject, dateToday, dueTimeOffset)
	local startDate, dueDate, i
	tell application id "OFOC"
		repeat with i from 1 to (length of pReviewIntervals)
			set newAction to duplicate selAction to end of tasks of dstProject
			set startDate to dateToday + (item i of pReviewIntervals) * days
			set dueDate to startDate + pReviewDaysUntilDue * days + dueTimeOffset
			tell newAction to set {start date, due date, completed} to {startDate, dueDate, false} -- if user already completed original, we need to make duplicate active
		end repeat
	end tell
end ProcessAction

on run {}
	set dateToday to (current date) - (time of (current date))
	set dueTime to my GetDefaultDueTime()
	tell application id "OFOC"
		tell front document
			tell content of first document window
				set lstSelected to value of (selected trees where class of its value is task)
				if ((count of lstSelected) = 0) then
					display alert "No suitable tasks in selection"
					return
				end if
			end tell
			try
				set dstProject to first flattened project whose name is pReviewProject
			on error
				display alert "Could not find destination project \"" & ¬
					pReviewProject & "\""
				return
			end try
			set oldWillAutosave to will autosave
			set will autosave to pAutoSave
			try -- catch any errors and restore autosave setting
				repeat with thisOne in lstSelected
					my ProcessAction(thisOne, dstProject, dateToday, dueTime)
				end repeat
			end try
			set will autosave to oldWillAutosave
		end tell
	end tell
end run

Last edited by whpalmer4; 2013-02-17 at 10:48 PM..