<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TannieSpace (Posts about omniweb)</title><link>https://tannie.nl/</link><description></description><atom:link href="https://tannie.nl/tags/omniweb.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2022 &lt;a href="mailto:tanja@tannie.nl"&gt;Tanja&lt;/a&gt; </copyright><lastBuildDate>Wed, 30 Mar 2022 13:35:09 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Applescripts for OmniFocus: change the context or project of selected tasks.</title><link>https://tannie.nl/2009/applescripts-for-omnifocus-change-the-context-or-project-of-selected-tasks/</link><dc:creator>Tanja</dc:creator><description>&lt;div&gt;&lt;p&gt;I use OmniFocus a lot, and have recently tweaked some more AppleScripts to make my workflow even more smooth. I can add any mail to OmniFocus for replies, add confirmation of orders from mail to OmniFocus which will automatically go into my project-shoebox for orders, with a 'waiting for' context and a due date set to 1 week into the future, unless I've changed or added &lt;a href="http://www.indev.ca/MailTags.html"&gt;MailTags&lt;/a&gt; with a project, a keyword and a due date. In that case it'll take the project, the first keyword and the due date and use them to set up the OmniFocus task. I have a few more scripts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;in OmniWeb I can take and add a URL for later reading, it'll go into my inbox by default&lt;/li&gt;
&lt;li&gt;in OmniWeb I can take and add a URL to my 'wish-list' project (with a start date for at 2 weeks in the future)&lt;/li&gt;
&lt;li&gt;in OmniFocus I have scripts to easily change the context or the project of selected tasks&lt;/li&gt;
&lt;li&gt;in Mail I can press a key and have the selected e-mail(s) sent to OmniFocus with a 'Respond to: ' before the subject line, sorting into either a default project or the one specified in MailTags, with the context set to 'mail' and the message URL in the note-field&lt;/li&gt;
&lt;li&gt;in OmniFocus I can select such a task, press a key to run a script that will open the message and immediately create a reply (I have a separate one for just opening, in case I have to read it thoroughly first)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All these scripts make the integration between all these programs very easy. That and &lt;a href="http://www.red-sweater.com/fastscripts/"&gt;FastScripts&lt;/a&gt;.
I found useful scripts over at &lt;a href="http://www.rose-hulman.edu/~clifton/software.html"&gt;Curtis Clifton's site&lt;/a&gt;. His scripts use &lt;a href="http://growl.info/"&gt;Growl&lt;/a&gt; notification so if you have Growl installed you get a small notification.&lt;/p&gt;
&lt;p&gt;I had some trouble putting my own scripts together, so I decided to paste the info here, just in case I need it later on, or someone else runs into similar issues. I found it quite hard to figure out how to add a task to an existing project or to move it from inbox / other project. In the end, it only took a few lines.&lt;/p&gt;
&lt;p&gt;First, when I started my script, I wanted a default project or context (I'll use 'project' from now on, but it also applies to the context-script). To do this I created a 'property' at the beginning of the script:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;defaultProject&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Miscellaneous"&lt;/span&gt; &lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;alertItemNum&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I used the alterItemNum for my alerts through this very simple routine:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="nv"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;alertName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;alertTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;alertText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;display dialog&lt;/span&gt; &lt;span class="nv"&gt;alertText&lt;/span&gt; &lt;span class="k"&gt;as &lt;/span&gt;&lt;span class="nc"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;icon&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="nv"&gt;notify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That went at the end of my script.&lt;/p&gt;
&lt;p&gt;I started by addressing OmniFocus and 'talking' to the open document:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nb"&gt;application&lt;/span&gt; &lt;span class="s2"&gt;"OmniFocus"&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nb"&gt;front&lt;/span&gt; &lt;span class="na"&gt;document&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;first&lt;/span&gt; &lt;span class="na"&gt;document&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nb"&gt;whose&lt;/span&gt; &lt;span class="na"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, I checked to see if that document had anything selected, and if not, give an error-dialogue:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;            &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;theSelectedItems&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;selected&lt;/span&gt; &lt;span class="nv"&gt;trees&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;
            &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;numItems&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt; &lt;span class="nb"&gt;items&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;theSelectedItems&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;numItems&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;alertName&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;"Error"&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;alertTitle&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;"Script failure"&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;alertText&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;"No valid task(s) selected"&lt;/span&gt;
                &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;alertName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;alertTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;alertText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="no"&gt;return&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If I have no items selected, the script will call the alert routine from above ( my notify(alertName, alertTitle, alertText) ). Because I created a separate routine, I can use this anywhere in the script.&lt;/p&gt;
&lt;p&gt;Next, display a dialogue asking for the project: ` display dialog "Change to what Project? " default answer defaultProject buttons {"Cancel", "OK"} default button 2&lt;/p&gt;
&lt;p&gt;set theProject to (the text returned of the result) ` The variable 'theProject' will now contain the name of the (new) project to move the tasks too.&lt;/p&gt;
&lt;p&gt;Next, the loop to go through all the items and move them:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;            &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;selectNum&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;numItems&lt;/span&gt;
            &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;successTot&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
            &lt;span class="k"&gt;repeat&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nv"&gt;selectNum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;selectedItem&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;item&lt;/span&gt; &lt;span class="nv"&gt;selectNum&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;theSelectedItems&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;succeeded&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;ChangeProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;selectedItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;theProject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;succeeded&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;successTot&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;successTot&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;selectNum&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;selectNum&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This loop will end as soon as the variable 'selectNum' (= numItems which I set to the count of the items in the variable SelectedItems) reaches 0. It calls the routine 'ChangeProject' which I'll get to in a bit, but I first want to wrap up this part. Let me also explain the 'if succeeded then set successTot to successTot + 1' line. The line before sets 'succeeded' to the result of the ChangeProject routine. This result can mean anything, numbers, letters, whatever. In this case we use it to return a 'true' or 'false'. That way, we only need to use 'if succeeded' (which will either be 'true' or 'false') as a condition. We don't need to check the actual content of the variable. This can come in handy for various checks, and it took me a while to catch on to that, so I figured I'd mention it here.&lt;/p&gt;
&lt;p&gt;To end this main routine, I used:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;            &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;alertName&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;"General"&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;alertTitle&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;"Script complete"&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;successTot&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;alertItemNum&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;"s"&lt;/span&gt;
            &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;alertText&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;successTot&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;" item"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;alertItemNum&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;" changed to Project "&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;theProject&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;alertName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;alertTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;alertText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Basically, this tells the dialogue box to say the script ran successfully and displays the number of items successfully moved and only to use the 's' after 'item' if the count of successful moves is higher than 1.&lt;/p&gt;
&lt;p&gt;That wraps up the main part.&lt;/p&gt;
&lt;p&gt;The routine to actually move the task to the other project only took 21 lines:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="nv"&gt;ChangeProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;selectedItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;theProject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;success&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
    &lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nb"&gt;application&lt;/span&gt; &lt;span class="s2"&gt;"OmniFocus"&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt; &lt;span class="na"&gt;document&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;theProject&lt;/span&gt; &lt;span class="ow"&gt;is not&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
            &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;MyProjectArray&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;null&lt;/span&gt;
            &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;MyProjectArray&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;complete&lt;/span&gt; &lt;span class="nv"&gt;theProject&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;project&lt;/span&gt; &lt;span class="nv"&gt;maximum&lt;/span&gt; &lt;span class="nv"&gt;matches&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;MyProjectID&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;first&lt;/span&gt; &lt;span class="nb"&gt;item&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;MyProjectArray&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;theNewProject&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;project&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="nv"&gt;MyProjectID&lt;/span&gt;
            &lt;span class="nb"&gt;on&lt;/span&gt; &lt;span class="k"&gt;error&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;theNewProject&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;make&lt;/span&gt; &lt;span class="nv"&gt;project&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="na"&gt;properties&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;theProject&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt;

            &lt;span class="k"&gt;try&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;newtask&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;selectedItem&lt;/span&gt;
                &lt;span class="nv"&gt;move&lt;/span&gt; &lt;span class="nv"&gt;newtask&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;tasks&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;theNewProject&lt;/span&gt;
                &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;success&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
    &lt;span class="no"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;success&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="nv"&gt;ChangeProject&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The first line sets the success to 'false', because we want to actively, &lt;em&gt;after&lt;/em&gt; having our success, set it to 'true'.
We then chat with OmniFocus again, and this time, we'll just talk to the default document (the one you have open). If the variable 'theProject' is not empty, we'll continue. If it is, the 'if-end if' ends, without having set the 'success' variable to true (and thus, the script failed). You could technically build in an extra loop to change it to a default project, however, I prefer it this way. If I accidentally emptied that dialogue-box, nothing will happen, just as I like it.&lt;/p&gt;
&lt;p&gt;If theProject does contain something (anything), the script continues with its routine. It sets the MyProjectArray to null (makes it empty, just in case). It then used OmniFocus complete option to find the first matching project of OmniFocuses project-list. If you've ever only typed the first three letters in one of OmniFocus's project-areas (to set the project) and it magically came up with the right project, this is the same thing. It means you only have to type the first three or four letters of your project, and the script will find it. If it can't find the project, it will create it for you (at the end of your project-list).&lt;/p&gt;
&lt;p&gt;After that, it will simply try to add the task to the desired project.&lt;/p&gt;&lt;/div&gt;</description><category>applescript</category><category>context</category><category>e-mail</category><category>easy</category><category>list</category><category>omnifocus</category><category>omniweb</category><category>project</category><guid>https://tannie.nl/2009/applescripts-for-omnifocus-change-the-context-or-project-of-selected-tasks/</guid><pubDate>Sun, 06 Sep 2009 22:34:47 GMT</pubDate></item><item><title>Bit.ly + TextExpander + Applescript = WIN!</title><link>https://tannie.nl/2009/bitly-textexpander-applescript-win/</link><dc:creator>Tanja</dc:creator><description>&lt;div&gt;&lt;p&gt;I wanted an easy way to shorten my URLs through one of the URL-shorteners out there. I liked &lt;a href="http://bit.ly/"&gt;bit.ly&lt;/a&gt;, because it's nice and short, has an easy to navigate web-interface (without a mouse) and I can use its magic with my terminal (cURL).&lt;/p&gt;
&lt;p&gt;I also very much like &lt;a href="http://www.smileonmymac.com/TextExpander/"&gt;TextExpander&lt;/a&gt; and after googling a bit, I ofcourse found an &lt;a href="http://www.livedigitally.com/2008/07/23/how-to-automatic-url-shortening-with-bitly-and-textexpander/"&gt;Applescript for TextExpander and Bit.ly&lt;/a&gt;. That link also shows how to set it up in TextExpander, very handy! The script does not however use your actual bit.ly account so you can keep track of the URLs you shorten. I tweaked it and made adjustments and it took hours and ofcourse, then I find &lt;a href="http://snipplr.com/view/13743/bitly-urlshortening-script-for-textexpander-that-associates-urls-with-your-bitly-account/"&gt;this&lt;/a&gt; which is almost exactly what I had, except with URL-encoding (yummy). The only problem with that one was that I couldn't get it to have the URLs show up in my recent history. The 'history=1' didn't seem to work.&lt;/p&gt;
&lt;p&gt;I tweaked some more and came up with something that completely does what I want. I use &lt;a href="http://www.omnigroup.com/applications/omniweb/"&gt;OmniWeb&lt;/a&gt; so I replaced the&lt;/p&gt;
&lt;p&gt;&lt;code&gt;set the PageURL to (the clipboard as string)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;with&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nb"&gt;application&lt;/span&gt; &lt;span class="s2"&gt;"OmniWeb"&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;PageURL&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;active&lt;/span&gt; &lt;span class="no"&gt;tab&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;browser&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you use safari, use&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nb"&gt;application&lt;/span&gt; &lt;span class="s2"&gt;"Safari"&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;PageURL&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;URL&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;front&lt;/span&gt; &lt;span class="na"&gt;document&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I've made this as readable as possible, the '¬' do matter in Applescript.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nb"&gt;application&lt;/span&gt; &lt;span class="s2"&gt;"OmniWeb"&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;PageURL&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;active&lt;/span&gt; &lt;span class="no"&gt;tab&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;browser&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;

&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;login&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;"YOUR LOGIN"&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;api_key&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;"YOUR API KEY"&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;EncodedURL&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;PageURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="k"&gt;me&lt;/span&gt;

&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;curlCMD&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="err"&gt;¬¨&lt;/span&gt; &lt;span class="s2"&gt;"curl --stderr /dev/null \"http://api.bit.ly/v3/shorten?format=txt&amp;amp;longUrl="&lt;/span&gt; &lt;span class="err"&gt;¬¨&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;EncodedURL&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;"&amp;amp;history=1&amp;amp;login="&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;login&lt;/span&gt; &lt;span class="err"&gt;¬¨&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;"&amp;amp;apiKey="&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;api_key&lt;/span&gt; &lt;span class="err"&gt;¬¨&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;"\""&lt;/span&gt;

&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="c"&gt;-- Run the script and get the result: set bitlyURL to (do shell script curlCMD)&lt;/span&gt;

&lt;span class="no"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;bitlyURL&lt;/span&gt;

&lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="nv"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;theText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;theTextEnc&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;eachChar&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;characters&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;theText&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;useChar&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;eachChar&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;ASCII number&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;eachChar&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;useChar&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;"+"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="err"&gt;‚â†&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="err"&gt;‚â†&lt;/span&gt; &lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="se"&gt;¬&lt;/span&gt;
    &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="se"&gt;¬&lt;/span&gt;
    &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;57&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="se"&gt;¬&lt;/span&gt;
    &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="se"&gt;¬&lt;/span&gt;
    &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;97&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;122&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;firstDig&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;rounding&lt;/span&gt; &lt;span class="nv"&gt;down&lt;/span&gt;
        &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;secondDig&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;eachCharNum&lt;/span&gt; &lt;span class="ow"&gt;mod&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;firstDig&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
            &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;aNum&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;firstDig&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;firstDig&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;ASCII character&lt;/span&gt; &lt;span class="nv"&gt;aNum&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;secondDig&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;aNum&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;secondDig&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;
    &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;secondDig&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;ASCII character&lt;/span&gt; &lt;span class="nv"&gt;aNum&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;numHex&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"%"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;firstDig&lt;/span&gt; &lt;span class="k"&gt;as &lt;/span&gt;&lt;span class="nc"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="se"&gt;¬&lt;/span&gt;
 &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;secondDig&lt;/span&gt; &lt;span class="k"&gt;as &lt;/span&gt;&lt;span class="nc"&gt;string&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;as &lt;/span&gt;&lt;span class="nc"&gt;string&lt;/span&gt;
 &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;useChar&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;numHex&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;theTextEnc&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;theTextEnc&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;useChar&lt;/span&gt; &lt;span class="k"&gt;as &lt;/span&gt;&lt;span class="nc"&gt;string&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt;
&lt;span class="no"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;theTextEnc&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="nv"&gt;urlencode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ETA (2010.09.30): bit.ly changed a few things so I changed the script above to reflect that&lt;/p&gt;&lt;/div&gt;</description><category>applescript</category><category>omniweb</category><category>textexpander</category><guid>https://tannie.nl/2009/bitly-textexpander-applescript-win/</guid><pubDate>Sat, 04 Apr 2009 13:49:02 GMT</pubDate></item><item><title>Why I like OmniWeb...</title><link>https://tannie.nl/2009/why-i-like-omniweb/</link><dc:creator>Tanja</dc:creator><description>&lt;div&gt;&lt;p&gt;After several days of OmniWeb use I remember why I so happily used it before. It zooms through pages and (yes, get this!) I can actually watch (YouTube) movies again. For months every time someone sent me a link to a YouTube or other movie I'd either have to say 'Sorry, can't watch that' or forward the link, I'm almost afraid to say, to my iPhone so I could watch it there.
Yes, you got that right, I could watch internet-movies on my iPhone but not on my laptop. Yes, I have an old laptop, but I love it.&lt;/p&gt;
&lt;p&gt;With OmniWeb I can actually watch most of them (though a bit staggering sometimes) because the browser itself doesn't eat up too many resources (looking at you again Firefox! this hate will soon pass but I will indulge in it a bit). So far I have not once had to close my browser or other programs to reclaim memory / cpu. Closing a few tabs does the trick. Now, I may have to do this every once in a while, but having to do it every two hours (you know who I'm talking about) gets really really annoying.&lt;/p&gt;
&lt;p&gt;Aaah, the small pleasures in life... YouTube movies...&lt;/p&gt;&lt;/div&gt;</description><category>browser</category><category>iphone</category><category>omniweb</category><guid>https://tannie.nl/2009/why-i-like-omniweb/</guid><pubDate>Tue, 17 Mar 2009 22:35:59 GMT</pubDate></item><item><title>OmniWeb now free!</title><link>https://tannie.nl/2009/omniweb-now-free/</link><dc:creator>Tanja</dc:creator><description>&lt;div&gt;&lt;p&gt;Once again I got frustrated with &lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt; and &lt;a href="http://www.apple.com/safari/"&gt;Safari&lt;/a&gt; for numerous reasons. I went over to the &lt;a href="http://www.omnigroup.com/"&gt;OmniGroup site&lt;/a&gt; to check out &lt;a href="http://www.omnigroup.com/applications/omniweb/"&gt;OmniWeb&lt;/a&gt; cause I really liked using its demo. I wanted to see what price they charged and see if I would want to part with that (next month) to solve my frustrations with The Other Browsers.&lt;/p&gt;
&lt;p&gt;And they made it &lt;a href="http://blog.omnigroup.com/2009/02/25/omniweb-omnidazzle-omnidisksweeper-and-omniobjectmeter-now-freeware/"&gt;free&lt;/a&gt;. I suck for only finding out now, three weeks after they made it free, but at least it means I can have my lovely browser that supports applescript &lt;em&gt;and&lt;/em&gt; Services (looking at you, Firefox!), doesn't take ages to load a page (again, looking at you, Firefox!) and supports non-mouse browsing (Firefox! no wait, that's actually Safari....).&lt;/p&gt;
&lt;p&gt;Very happy :D&lt;/p&gt;&lt;/div&gt;</description><category>applescript</category><category>browser</category><category>omniweb</category><guid>https://tannie.nl/2009/omniweb-now-free/</guid><pubDate>Fri, 13 Mar 2009 21:32:08 GMT</pubDate></item></channel></rss>