I found a few bugs in the script, particularly with handling multiple selections. I also made deferral of both start and due dates the default. Here's the updated code:
Code:
(*
This script takes the currently selected actions or projects and defers, or "snoozes", them by the user-specified number of days.
The user may snooze just the due date or both the start and due dates (useful for skipping weekends for daily recurring tasks).
version 0.1, by Dan Byler
Copyright © 2008, Daniel N. Byler (contact: dbyler@gmail.com)
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
• Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
• Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
version 0.1: Original release
Installation: Copy to ~/Library/Scripts/Applications/Omnifocus
If desired, add to the OmniFocus toolbar using View > Customize Toolbar... within OmniFocus
Known bugs:
• When the script is invoked from the OmniFocus toolbar and canceled, OmniFocus returns an error. This issue does not occur when invoked from the script menu, a Quicksilver trigger, etc.
*)
property showAlert : true --if true, will display success/failure alerts
property useGrowl : true --if true, will use Growl for success/failure alerts
property defaultSnooze : 1 --number of days to defer by default
property alertItemNum : ""
property alertDayNum : ""
-- property successTot : 0
property growlAppName : "Dan's Scripts"
property allNotifications : {"General", "Error"}
property enabledNotifications : {"General", "Error"}
property iconApplication : "OmniFocus.app"
tell application "OmniFocus"
tell front document
tell (first document window whose index is 1)
set theSelectedItems to selected trees of content
set numItems to (count items of theSelectedItems)
if numItems is 0 then
set alertName to "Error"
set alertTitle to "Script failure"
set alertText to "No valid task(s) selected"
my notify(alertName, alertTitle, alertText)
return
end if
display dialog "Defer for how many days?" default answer defaultSnooze buttons {"Cancel", "OK"} default button 2
(* if (the button returned of the result) is not "OK" then
return
end if *)
set snoozeLength to (the text returned of the result) as integer
if snoozeLength is not 1 then
set alertDayNum to "s"
end if
set changeScopeQuery to display dialog "Modify start and due dates?" buttons {"Cancel", "Due Only", "Start and Due"} default button 3 with icon caution giving up after 60
set changeScope to button returned of changeScopeQuery
if changeScope is "Cancel" then
return
else if changeScope is "Start and Due" then
set modifyStartDate to true
else if changeScope is "Due Only" then
set modifyStartDate to false
end if
set selectNum to numItems
set successTot to 0
repeat while selectNum > 0
set selectedItem to value of item selectNum of theSelectedItems
set succeeded to my defer(selectedItem, snoozeLength, modifyStartDate)
if succeeded then set successTot to successTot + 1
set selectNum to selectNum - 1
end repeat
set alertName to "General"
set alertTitle to "Script complete"
if successTot > 1 then set alertItemNum to "s"
set alertText to successTot & " item" & alertItemNum & " deferred " & snoozeLength & " day" & alertDayNum & ". (" & changeScope & ")" as string
end tell
end tell
my notify(alertName, alertTitle, alertText)
end tell
on defer(selectedItem, snoozeLength, modifyStartDate)
set success to false
tell application "OmniFocus"
set theDueDate to due date of selectedItem
if (theDueDate is not missing value) then
set newDue to (theDueDate + (86400 * snoozeLength))
set due date of selectedItem to newDue
set success to true
end if
if modifyStartDate is true then
set theStartDate to start date of selectedItem
if (theStartDate is not missing value) then
set newStart to (theStartDate + (86400 * snoozeLength))
set start date of selectedItem to newStart
set success to true
end if
end if
end tell
return success
end defer
on notify(alertName, alertTitle, alertText)
if showAlert is false then
return
else if useGrowl is true then
tell application "GrowlHelperApp"
register as application growlAppName all notifications allNotifications default notifications enabledNotifications icon of application iconApplication
notify with name alertName title alertTitle application name growlAppName description alertText
end tell
else
display dialog alertText with icon 1
end if
end notify