The Omni Group
These forums are now read-only. Please visit our new forums to participate in discussion. A new account will be required to post in the new forums. For more info on the switch, see this post. Thank you!

Go Back   The Omni Group Forums > OmniFocus > OmniFocus 1 for Mac
FAQ Members List Calendar Search Today's Posts Mark Forums Read

 
So Task->Duplicate only works in project mode? Thread Tools Search this Thread Display Modes
Quote:
Originally Posted by skillet View Post
...Currently I use flags for things I really should do for the day, like help someone out, practice goals I have etc., but that are not actually due that day. Repeating actions often don't fit into that category, so I couldn't flag them according to that method. ....
In essence then, you have a perspective (flagged) that does not show the repeat action. When you are truly intending to do the repeat action, flag it. Otherwise, consider it showing in your unflagged lists only as "available now for ongoing daily/weekly ... review" rather than "available now to do now". Then, you could stop worrying about how to shuffle the task off to a different date, only later to "re-shuffle" and then "re-shuffle" and then ... someday eventually maybe marking that task truly to do.

Just a thought.

ps -- You will have to unflag the repeat task before you check it off complete or your new repeat task will return as being flagged.

--
JJW
 
Quote:
Originally Posted by whpalmer4 View Post
Though now that someone finally wrote this script maybe I'll start using it :-)
Let me know how you like it ;)

I spent about 4 hours today trying to write a script that worked on multiple selected actions and...
1) would not run if there is any repeating actions selected.
2) duplicate selected actions.
3) mark them as [In Progress] in the action name.
4) mark them as complete.
5) select the original actions (I might have to do this on only one action at a time because of this).
6) forward only the start dates from today's date by a given amount. Not the original start date if it was say yesterday.

This script does step 6 but unfortunately it does not keep the original start time.

Code:
(*
	# DESCRIPTION #
	
	This script "snoozes" the currently selected actions or projects by setting the start date to given number of days in the future.
	
	
	# LICENSE #
	
	Copyright © 2010 Dan Byler (contact: dbyler@gmail.com)
	Licensed under MIT License (http://www.opensource.org/licenses/mit-license.php)
	
	
	# CHANGE HISTORY #
	
	0.2c (2010-06-22)
	-	Actual fix for autosave
	
	0.2b (2010-06-21)
	-	Encapsulated autosave in "try" statements in case this fails
	
	0.2 (2010-06-15)
	-	Fixed Growl code
	-	Added performance optimization (thanks, Curt Clifton)
	-	Changed from LGPL to MIT license (MIT is less restrictive)
		
	0.1: Original release. (Thanks to Curt Clifton, Nanovivid, and Macfaninpdx for various pieces of code)

	
	# 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 FastScripts or Quicksilver trigger, etc.
		
*)

property showAlert : false --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 snooze by default
property alertItemNum : ""
property alertDayNum : ""
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 "Snooze start date for how many days from today?" default answer defaultSnooze buttons {"Cancel", "OK"} default button 2
			set snoozeLength to (the text returned of the result) as integer
			set todayStart to (current date) - (get time of (current date))
			if snoozeLength is not 1 then
				set alertDayNum to "s"
			end if
			set selectNum to numItems
			set successTot to 0
			set autosave to false
			repeat while selectNum > 0
				set selectedItem to value of item selectNum of theSelectedItems
				set succeeded to my snooze(selectedItem, todayStart, snoozeLength)
				if succeeded then set successTot to successTot + 1
				set selectNum to selectNum - 1
			end repeat
			set autosave to true
			set alertName to "General"
			set alertTitle to "Script complete"
			if successTot > 1 then set alertItemNum to "s"
			set alertText to successTot & " item" & alertItemNum & " snoozed. The item" & alertItemNum & " will become available in " & snoozeLength & " day" & alertDayNum & "." as string
		end tell
	end tell
	my notify(alertName, alertTitle, alertText)
end tell

on snooze(selectedItem, todayStart, snoozeLength)
	set success to false
	tell application "OmniFocus"
		try
			set newStart to (todayStart + (86400 * snoozeLength))
			set start date of selectedItem to newStart
			set success to true
		end try
	end tell
	return success
end snooze

on notify(alertName, alertTitle, alertText)
	if showAlert is false then
		return
	else if useGrowl is true then
		--check to make sure Growl is running
		tell application "System Events" to set GrowlRunning to ((application processes whose (name is equal to "GrowlHelperApp")) count)
		if GrowlRunning = 0 then
			--try to activate Growl
			try
				do shell script "/Library/PreferencePanes/Growl.prefPane/Contents/Resources/GrowlHelperApp.app/Contents/MacOS/GrowlHelperApp > /dev/null 2>&1 &"
				do shell script "~/Library/PreferencePanes/Growl.prefPane/Contents/Resources/GrowlHelperApp.app/Contents/MacOS/GrowlHelperApp > /dev/null 2>&1 &"
			end try
			delay 0.2
			tell application "System Events" to set GrowlRunning to ((application processes whose (name is equal to "GrowlHelperApp")) count)
		end if
		--notify
		if GrowlRunning ≥ 1 then
			try
				tell application "GrowlHelperApp"
					register as application growlAppName all notifications allNotifications default notifications allNotifications icon of application iconApplication
					notify with name alertName title alertTitle application name growlAppName description alertText
				end tell
			end try
		else
			set alertText to alertText & " 
 
p.s. Don't worry—the Growl notification failed but the script was successful."
			display dialog alertText with icon 1
		end if
	else
		display dialog alertText with icon 1
	end if
end notify

I downloaded Script Debugger like you use Bill and that was helpful. I was able to modify your scripts.
1) get it to check if actions had a repeat so it wouldn't run if they did.
2) Forward only the start date (sadly not from today's date but from the original start date but at least it kept the same start time).
3) Marked the actions as complete.

Still need to figure out how to get it to work with your append text to action name and how to duplicate a non repeating action if that is even possible.

*UPDATE: Found this forum for how to duplicate a non repeating action. http://forums.omnigroup.com/showpost...69&postcount=7

I plan on posting an update when I am able to work this out.

Quote:
Originally Posted by whpalmer4 View Post

Onomatopoeic :-)
Nice that is good! Thanks for a new word in my vocabulary, now if only I can remember that in the future.

Quote:
Originally Posted by whpalmer4 View Post

Is "Task" different than "task" in Applescript? In all cases? No such worries with "oTask"! I think I've probably read more of Rob's Applescript than anyone else's, so some of his style may have rubbed off on me, especially the part about writing scripts for others instead of focusing on one's own work at times :-)
That makes sense thanks for the tip.

Last edited by skillet; 2011-09-17 at 03:33 AM..
 
Quote:
Originally Posted by DrJJWMac View Post
In essence then, you have a perspective (flagged) that does not show the repeat action. When you are truly intending to do the repeat action, flag it. Otherwise, consider it showing in your unflagged lists only as "available now for ongoing daily/weekly ... review" rather than "available now to do now". Then, you could stop worrying about how to shuffle the task off to a different date, only later to "re-shuffle" and then "re-shuffle" and then ... someday eventually maybe marking that task truly to do.

Just a thought.

ps -- You will have to unflag the repeat task before you check it off complete or your new repeat task will return as being flagged.

--
JJW
Thanks for the ideas, also your ps helped clarify the method described. Thanks for taking the time to explain this.
 
Quote:
Originally Posted by skillet View Post
I plan on posting an update when I am able to work this out.
Ok I didn't work this out whpalmer4 did in post 8

It's even better than I thought it could be. It works on multiple actions and doesn't need to check if actions are repeating since it duplicates them and removes the repeat and flag. Here's the AppleScript he compiled.

Code:
--*** This script uses four scripts combined
-- Some code from Dan Byler's "Snooze" script
(* 	# LICENSE #
	
	Copyright © 2010 Dan Byler (contact: dbyler@gmail.com)
	Licensed under MIT License (http://www.opensource.org/licenses/mit-license.php)
*)

--http://forums.omnigroup.com/showthread.php?p=101869#post101869 post 7 by scb	
--***Copy a list of selected tasks , or an individual task, to non repeating and remove flags if any. The original task is marked as completed.

property prependText : "[Follow-Up] "

property showAlert : false --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 snooze by default
property alertItemNum : ""
property alertDayNum : ""
property growlAppName : "Dan's Scripts"
property allNotifications : {"General", "Error"}
property enabledNotifications : {"General", "Error"}
property iconApplication : "OmniFocus.app"

tell application "OmniFocus"
	activate
	tell default document
		set FrontWindow to first document window whose index is 1
		tell FrontWindow
			
			display dialog "Snooze start date for how many days from today?" default answer defaultSnooze buttons {"Cancel", "OK"} default button 2
			set snoozeLength to (the text returned of the result) as integer
			set todayStart to (current date) - (get time of (current date))
			if snoozeLength is not 1 then
				set alertDayNum to "s"
			end if
			
			if ((count of leaves of selected trees of content) is 0) then
				set theItems to value of selected trees of content
			else
				set theItems to (value of leaves of selected trees of content) as list
			end if
			
			set successTot to 0
			repeat with anItem in theItems
				if (class of anItem) is list then
					repeat with subItem in anItem
						if (class of subItem is task or class of subItem is inbox task) then
							
							set newitem to duplicate subItem to after subItem
							set repetition of newitem to missing value
							set flagged of newitem to false
							set completed of subItem to true
							set name of subItem to prependText & name of subItem
							set succeeded to my snooze(newitem, todayStart, snoozeLength)
							if succeeded then set successTot to successTot + 1
							
						end if
					end repeat
					
				else if (class of anItem is task or class of anItem is inbox task) then
					set newitem to duplicate anItem to after anItem
					set repetition of newitem to missing value
					set flagged of newitem to false
					set completed of anItem to true
					set name of anItem to prependText & name of anItem
					set succeeded to my snooze(newitem, todayStart, snoozeLength)
					if succeeded then set successTot to successTot + 1
					
				end if
			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 & " snoozed. The item" & alertItemNum & " will become available in " & snoozeLength & " day" & alertDayNum & "." as string
			my notify(alertName, alertTitle, alertText)
		end tell
	end tell
end tell


-- ***Now change only the start date from absolute date (today's date) and not relative date.  Keep due date the same since that doesn't typically change (if so I would change that by hand or with another Dan's defer script)

--***The only thing I would change about this is to keep the start time (but not date) the same as it was, and not change it to 12AM like this script does.  I really like that it moves it from today's date because that way I know the exact date all the selected actions will be on.

on snooze(selectedItem, todayStart, snoozeLength)
	set success to false
	tell application "OmniFocus"
		try
			set oldStart to start date of selectedItem
			set daysBetween to (todayStart - oldStart) / days as integer -- compute # of full days between orig start date+time and start of today
			-- new start is old start + daysBetween + snooze + 1 (because snoozeLength 1 means starts tomorrow, not today)
			set newStart to oldStart + (days * (daysBetween + snoozeLength))
			set start date of selectedItem to newStart
			set success to true
		end try
	end tell
	return success
end snooze

on notify(alertName, alertTitle, alertText)
	if showAlert is false then
		return
	else if useGrowl is true then
		--check to make sure Growl is running
		tell application "System Events" to set GrowlRunning to ((application processes whose (name is equal to "GrowlHelperApp")) count)
		if GrowlRunning = 0 then
			--try to activate Growl
			try
				do shell script "/Library/PreferencePanes/Growl.prefPane/Contents/Resources/GrowlHelperApp.app/Contents/MacOS/GrowlHelperApp > /dev/null 2>&1 &"
				do shell script "~/Library/PreferencePanes/Growl.prefPane/Contents/Resources/GrowlHelperApp.app/Contents/MacOS/GrowlHelperApp > /dev/null 2>&1 &"
			end try
			delay 0.2
			tell application "System Events" to set GrowlRunning to ((application processes whose (name is equal to "GrowlHelperApp")) count)
		end if
		--notify
		if GrowlRunning ≥ 1 then
			try
				tell application "GrowlHelperApp"
					register as application growlAppName all notifications allNotifications default notifications allNotifications icon of application iconApplication
					notify with name alertName title alertTitle application name growlAppName description alertText
				end tell
			end try
		else
			set alertText to alertText & " 
 
p.s. Don't worry—the Growl notification failed but the script was successful."
			display dialog alertText with icon 1
		end if
	else
		display dialog alertText with icon 1
	end if
end notify
 
Quote:
Originally Posted by whpalmer4 View Post
This has come up before. It'll probably come up again.

If you duplicate (or create) a task in project mode, you can immediately see where it went and put it where you want it. Not so in context mode. Maybe you always want your duplicate task tucked in right behind the original, but I can't think of the last time where that was what I wanted to do with a duplicate.
I'm sorry, I think this is stupid behavior. 90% of the time, I do want the duplicate right behind the original because I'm dealing with a simple project. One could always change it in project view if necessary.
 
Send feedback to Omni. If enough other people express that opinion, they'll consider changing it, though part of the calculus will undoubtedly be to look at whether the proposed change will make it more or less likely that they'll get support contacts from confused users. The current behavior inconveniences some, but doesn't generate frustrated users reporting "I tried Duplicate but nothing shows up!" My guess is that the count of people who have actually complained about this implementation decision is pretty small, relatively speaking.

Or you could use AppleScript to implement something that would do the Duplicate operation despite being in Context mode. Such a script might look something like this:

Code:
tell application "OmniFocus"
	tell first document window of front document
		set selTrees to selected trees of content
		repeat with i from 1 to count of items of selTrees
			try
				set targetItem to value of item i of selTrees
				set newItem to duplicate targetItem to after targetItem
			on error
				display alert "Time to learn some AppleScript!"
			end try
		end repeat
	end tell
end tell
It would suffer from the same problems, such as duplicated items not appearing next to the original (if grouping by Added, for example) or at all (if duplicating a sequential action in a Next Action view).
 
Quote:
Originally Posted by mcogilvie View Post
I'm sorry, I think this is stupid behavior. 90% of the time, I do want the duplicate right behind the original because I'm dealing with a simple project. One could always change it in project view if necessary.
That frustrated me to, try this script and see if it work the way you like. You can turn on in the script if you want flags to be turned off on the duplicate.

Whpalmer4 (one of my OmniFocus script hero's) the script you posted duplicates the first selected action the amount of actions you have selected.
Attached Files
File Type: zip Duplicate.scpt.zip (20.6 KB, 184 views)
 
Hmm, it didn't do that for me, but maybe I changed something after that test. Thanks for the report, I'll have a look back at the Mac.
 
 


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes


Similar Threads
Thread Thread Starter Forum Replies Last Post
Duplicate a Project TomW OmniFocus for iPad 23 2012-04-29 09:20 AM
Cannot duplicate a task in context view? brab OmniFocus 1 for Mac 9 2011-03-05 04:05 AM
Duplicate Task Entries evansb OmniFocus 1 for Mac 2 2008-01-23 10:07 AM
Can't duplicate a task kastorff OmniFocus 1 for Mac 3 2007-12-20 07:22 PM
Can't duplicate actions in Context mode santra OmniFocus 1 for Mac 1 2007-12-19 07:00 PM


All times are GMT -8. The time now is 04:06 AM.


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