The Omni Group Forums

The Omni Group Forums (http://forums.omnigroup.com/index.php)
-   OmniFocus 1 for Mac (http://forums.omnigroup.com/forumdisplay.php?f=38)
-   -   Applescript to Strip Off Leading Characters (http://forums.omnigroup.com/showthread.php?t=21463)

msheaver 2011-06-26 10:17 AM

Applescript to Strip Off Leading Characters
 
I have set my OF mail rule to automatically create an OF action whenever an email arrives from selected addresses with a subject line that begins with "@OF", and it works very well for me. I am using this approach to create tasks when working from the office. My question is this: Is there any easy way to have OF automatically strip off the "@OF " as it imports new actions from the mail rule? I understand that Applescript might be the way to go, but being new to both OmniFocus and Applescript, need help in this.

Lizard 2011-06-27 11:34 AM

You could probably hack the MailAction.applescript inside the OmniFocus app bundle to do this. But I'm not sure that's the best course of action.

The '@' symbol in particular is what OmniFocus uses to find a context in the message, so that if you sent an email "Pick up cat food @errands" it would create an action "Pick up cat food" and set its context to "errands".

Here's some more detail:
[url]http://www.macsparky.com/blog/2010/10/20/adding-tasks-to-omnifocus-with-e-mail.html[/url]

whpalmer4 2011-07-08 07:09 PM

I just coded up two different approaches to this. You can pick which you like better.

Approach #1 is to modify the MailAction handler to strip off the "@OF " prefix from the subject line of the message. You can configure the prefix to be stripped by editing subjectPrefix in the script, just be sure to add whatever whitespace you are going to use in your messages to delimit the prefix. Note that this will strip the prefix even if you configure OmniFocus/Mail to use the "+omnifocus" method, and in that case, if your email subject line started with "@context" and "@context" matched your subjectPrefix, it would be stripped away before being processed by OmniFocus, which would lose you the context assignment, as Lizard mentioned. I think most people will naturally write the task name first, followed by any context, project, date, etc. specifications, so this probably isn't an issue.

What is an issue is that you'll have to apply this change to every new version of OmniFocus you install. That might be pretty annoying if you are using the sneaky peek builds. You may also need to update it if Omni changes the MailAction handler. It doesn't happen very often (they apparently can't even be bothered to put in the one line change I gave them to help users debug why their messages aren't arriving in OmniFocus, [url]http://forums.omnigroup.com/showthread.php?p=95091#post95091[/url]), but you should be aware of the possibility. That said, here's the code:

[code]
-- Copyright 2007 The Omni Group. All rights reserved.
--
-- $Header: svn+ssh://source.omnigroup.com/Source/svn/Omni/branches/OmniFocus/1.9.x/OmniGroup/Applications/OmniFocus/App/Preferences/MailAction.applescript 110059 2009-03-12 04:33:13Z kc $

property subjectPrefix : "@OF "
property prefixLength : count of subjectPrefix

using terms from application "Mail"
-- Trims "foo <foo@bar.com>" down to "foo@bar.com"
on trim_address(theAddress)
try
set AppleScript's text item delimiters to "<"
set WithoutPrefix to item 2 of theAddress's text items
set AppleScript's text item delimiters to ">"
set MyResult to item 1 of WithoutPrefix's text items
on error
set MyResult to theAddress
end try
set AppleScript's text item delimiters to {""} --> restore delimiters to default value
return MyResult
end trim_address


on process_message(theMessage)
tell application "OmniFocus"
log "OmniFocus calling process_message in MailAction script"
end tell
-- Allow the user to type in the full sender address in case our trimming logic doesn't handle the address they are using.
set theSender to sender of theMessage
set trimmedSender to my trim_address(theSender)
tell application "OmniFocus"
set AllowedSender to allowed mail senders
if AllowedSender does not contain trimmedSender and AllowedSender does not contain theSender then
return
end if
end tell

set theSubject to subject of theMessage
if (theSubject begins with subjectPrefix) then
tell application "OmniFocus"
set newSubject to rich text (1 + prefixLength) thru -1 of theSubject
end tell
set theSubject to newSubject
end if
set singleTask to false
if (theSubject starts with "Fwd: ") then
-- Whole forwarded messages shouldn't split.
set singleTask to true
set theSubject to text 6 through -1 of theSubject
end if
set theText to theSubject & return & content of theMessage
tell application "OmniFocus"
tell default document
parse tasks with transport text theText as single task singleTask
end tell
end tell
end process_message

on perform mail action with messages theMessages
try
set theMessageCount to count of theMessages
repeat with theMessageIndex from 1 to theMessageCount
my process_message(item theMessageIndex of theMessages)
end repeat
on error m number n
tell application "OmniFocus"
log "Exception in Mail action: (" & n & ") " & m
end tell
end try
end perform mail action with messages
end using terms from



[/code]

Another approach, much easier to maintain, but a little more work to use, is to have a script that simply strips off the subject prefix from any actions in the selection. No worries about interference with the processing, or Omni changing the code out from under you. It's just a slightly modified version of a script Curt Clifton wrote to strip suffixes off of projects and actions another script had used to tag them for attention.

[code]

(*
This script takes the currently selected actions or projects and simply strips the prefix added by the user.

Based on Clear "Missing NA" Suffixes script by Curt Clifton

version 0.1, by Curt Clifton

Copyright © 2007, Curtis Clifton

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.5.2: Unchanged
version 0.1.1: Fixed bug that was exposed by OmniFocus 1.1
version 0.1: Original release
*)

property prefixToStrip : "@OF "
property prefixLength : count of prefixToStrip

tell application "OmniFocus"
tell front document
tell document window 1
set theSelectedItems to value of selected trees of content
repeat with anItem in theSelectedItems
tell anItem
if (name begins with prefixToStrip) then
set newName to rich text (1 + prefixLength) thru -1 of (get name)
set name to newName
end if
end tell
end repeat
end tell
end tell
end tell
[/code]


All times are GMT -8. The time now is 07:36 PM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.