I’ve downloaded a folder action script that automatically creates tasks from the documents in the folder (with the document as an embedded attachment) in OmniFocus. The link to the article and script is here.
What I would like to do with this is modify it to add the task with the document link back DEVONthink (x-devonthink-item://…) and attach the script to a DEVONthink group to run when the group is selected, and new documents have been added to the group.
I suspect that the biggest challenge would be to not add all documents that have already been added as a task in OmniFocus, and naturally the code needs to add a link to the document rather than embed the document as an attachment. Any thoughts?
Original code:
on adding folder items to this_folder after receiving added_items
try
repeat with i from 1 to number of items in added_items
set this_item to item i of added_items
tell application "Finder" to set file_name to (name of this_item)
tell application "OmniFocus"
tell quick entry
open
set NewTask to make new inbox task with properties {name:file_name}
tell the note of NewTask
make new file attachment with properties {file name:this_item, embedded:true}
end tell
activate
end tell
end tell
end repeat
end try
end adding folder items to
I believe this might do what you’re looking to do:
(* Trigger Script to Add Group Contents to OmniFocus.scpt
This script is added to a group in DEVONthink (in the Info Panel for that
group). When the group is selected, the script executes. The script examines
the items in the group to see if they have the token "_OF" in their name. If
yes, then skip that item, if no, then the item has not been added to OF as link
to an OF task. Open the OF Quick Entry window, populated with tasks whose name is
the record name in DT, and which have an URL attached that link back to the DT
record. Do what you do in the Quick Entry window and save it. *)
on triggered(theRecord)
try
tell application id "com.devon-technologies.thinkpro2"
set theSelection to the children of theRecord
repeat with thisItem in theSelection
if the name of thisItem does not contain "_OF" then
set thisURL to reference URL of thisItem
set thisName to name of thisItem
tell application "OmniFocus"
tell quick entry
open
set newTask to make new inbox task with properties {name:thisName, note:thisURL}
activate
end tell
end tell
set thisName to thisName & "_OF"
set the name of thisItem to thisName
end if
end repeat
end tell
end try
end triggered
As noted in the script, the suffix “_OF” is used to indicate an OF item has been created for the DT record. Use any token, prefix, or suffix desired. Merely modify those code sections.
The script is not smart enough to know that you actually finished Quick Entry.
If the master of OF scripting, Robin Trew (here, @Houthakker), stops by this thread he might have a suggestion for checking in OF to see if a given DT reference url is attached to one or more OF tasks
Not sure if this is what you are after, but the simplest way to check whether there are any OF tasks with notes containing Devonthink UUIDs would be to look in the cache, casting the notexmldata field to text (from ‘blob’).
A first draft might look something like:
property pstrPrefix : "x-devonthink-item://"
-- Example (returns an integer of value zero or more)
DevUUIDCountInOF("8A772553-DE20-495C-BD7D-A8E72403EC27")
on DevUUIDCountInOF(strDevnUUID)
set strCmd to "sqlite3 ~/Library/Caches/com.omnigroup.OmniFocus/OmniFocusDatabase2 " & ¬
quoted form of ("select count(*) from task where cast(notexmldata as text) like \"%" & pstrPrefix & strDevnUUID & "%\"")
(do shell script strCmd) as integer
end DevUUIDCountInOF
(Strictly one should probably search for a fuller pattern in the Note XML, like: