I want to thank Sven Fechner, Scott Morrison, whpalmer4, jgrafix, papalpha, and Greg Jones for the scripts and guidance that has helped me with this. I use this script daily, and find it invaluable. I recently decided to start using more start dates and very few due dates in OF...so utilized the great scripts and advice from you to cobble something together. This script will produce a start date only (no due date) which is determined by entering the tickler date in MailTags. It also works if you don't enter anything in the tickler field...leaving blank start and due fields. I know this isn't that big a deal...but I'm horrible at AppleScript...so this took me awhile to figure out. I figured I'd post it for anybody interested.
Code:
(*
Waiting For Mails to OmniFocus Script
by simplicityisbliss.com, Sven Fechner
MailTags project and due date compatibility added by Scott Morrison, Indev Software
Based on an Outbox Rule (Mail Act-On) in Mail.app this script adds specific messages
to the OmniFocus Inbox with the waiting for context
MailTags is required to automatically set the project and the due date.
Mail Act-On (www.indev.ca) is required to define the Outbox Rule to only
create tasks for those outgoing emails that are to be tracked in OmniFocus
A sample Outbox rule may be
if MailTags Tickle Date is After 0 days today
Run Apple Script: [ThisAppleScript]
The script uses Growl for feedback notification if it is installed and running
*)
--!! EDIT THE PROPERTIES BELOW TO MEET YOUR NEEDS !!--
-- Do you want the actualy mail body to be added to the notes section of the OmniFocus task?
-- Set to 'true' is or 'false' if no
property mailBody : true
-- Text between mail recipient (the person you are waiting for to come back) and the email subject
property MidFix : "to follow up re:"
-- Name of your Waiting For context in OmniFocus
property myWFContext : "Waiting for"
-- Default due time
property timeStart : "11:59:00 PM"
-- !! STOP EDITING HERE IF NOT FAMILAR WITH APPLESCRIPT !! --
--Configuration for Growl messages
property GrowlRun : false
property scriptName : "Waiting For Mails to OmniFocus"
property notifySuccess : "Success Notification"
property notifyFail : "Failed Notification"
property titleSuccess : "Waiting For Mail added"
property titleFail : "Waiting For Mail to OmniFocus FAILED"
property txtSuccess : " added to OmniFocus successfully"
property txtFail : " to OmniFocus to add successfully"
property txtIcon : "OmniFocus"
on perform_mail_action(theData)
--Check if Growl is running
tell application "System Events" to set GrowlRun to (count of (every process whose name is "Growl")) > 0
--Setup Growl
if GrowlRun then tell application "Growl" to register as application scriptName all notifications {notifySuccess, notifyFail} default notifications {notifySuccess, notifyFail} icon of application txtIcon
--Get going
tell application "Mail"
set theMessages to |SelectedMessages| of theData --Extract the messages from the rule
repeat with theMessage in theMessages
set theSubject to subject of theMessage
set theRecipient to name of to recipient of theMessage
set theMessageID to urlencode(the message id of theMessage) of me
set theStartDate to date "Tuesday, January 1, 1991 11:59:00 PM"
try
using terms from application "MailTagsScriptingSupport"
set theStartDate to (due date of theMessage) as date
set theStartDate to my setDate(theDueDate)
end using terms from
on error theError
end try
-- tell application "Growl" to notify with name notifySuccess title titleSuccess description "test" & txtSuccess application name scriptName
-- do shell script "echo test"
-- Check if there is one or more recipients
try
if (count of theRecipient) > 1 then
set theRecipientName to (item 1 of theRecipient & (ASCII character 202) & "and" & (ASCII character 202) & ((count of theRecipient) - 1) as string) & (ASCII character 202) & "more"
else
set theRecipientName to item 1 of theRecipient
end if
set theTaskTitel to theRecipientName & (ASCII character 202) & MidFix & (ASCII character 202) & theSubject
set messageURL to "Created from message://%3C" & (theMessageID) & "%3E"
set theBody to messageURL
if mailBody then set theBody to theBody & return & return & the content of theMessage
-- Add waiting for context task to OmniFocus
tell application "OmniFocus"
tell default document
set theContext to context myWFContext
-- set theTask to make new inbox task with properties {name:theTaskTitel, note:theBody, context:theContext, due date:theDueDate}
if theStartDate is not date "Tuesday, January 1, 1991 11:59:00 PM" then
set theTask to make new inbox task with properties {name:theTaskTitel, note:theBody, context:theContext, start date:theStartDate}
else
set theTask to make new inbox task with properties {name:theTaskTitel, note:theBody, context:theContext}
end if
if myProject is not null then
set theProject to project myProject
move theTask to end of tasks of theProject
end if
end tell
end tell
on error theError
do shell script "logger -t outboxrule 'Error : " & theError & "' "
end try
my GrowlSuccess("Mail: " & theSubject)
end repeat
end tell
end perform_mail_action
on GrowlSuccess(theMessage)
if GrowlRun then tell application "Growl" to notify with name notifySuccess title titleSuccess description theMessage & txtSuccess application name scriptName
end GrowlSuccess
on urlencode(theText)
set theTextEnc to ""
repeat with eachChar in characters of theText
set useChar to eachChar
set eachCharNum to ASCII number of eachChar
if eachCharNum = 32 then
set useChar to "+"
else if (eachCharNum ≠ 42) and (eachCharNum ≠ 95) and (eachCharNum < 45 or eachCharNum > 46) and (eachCharNum < 48 or eachCharNum > 57) and (eachCharNum < 65 or eachCharNum > 90) and (eachCharNum < 97 or eachCharNum > 122) then
set firstDig to round (eachCharNum / 16) rounding down
set secondDig to eachCharNum mod 16
if firstDig > 9 then
set aNum to firstDig + 55
set firstDig to ASCII character aNum
end if
if secondDig > 9 then
set aNum to secondDig + 55
set secondDig to ASCII character aNum
end if
set numHex to ("%" & (firstDig as string) & (secondDig as string)) as string
set useChar to numHex
end if
set theTextEnc to theTextEnc & useChar as string
end repeat
return theTextEnc
end urlencode
on setDate(theStartDate)
set theDate to (date string of theStartDate)
set newDate to the (date (theDate & " " & timeStart))
-- tell application "Growl" to notify with name notifySuccess title "test"
return newDate
end setDate
The only thing missing is the ability to dictate my own time...my scripting seems to have killed that functionality and I can't figure out how to get it back. As it is...I keep getting my Start dates at 12:00 AM. If anybody wanted to help me out with this...I'd be very appreciative.
Cheers.