Catch Up Automatically

Summary: Sets all the selected repeating actions to “Catch Up Automatically.”
Requires: OmniFocus Pro
Install Location: ~/Library/Scripts/Applications/OmniFocus/
Last Modified: 2026-01-13

Description

Changing the Catch Up Automatically for repeating actions takes a long time in the user interface because the checkbox is inside a popover that’s only accessible when a single action is selected. This script lets you select multiple actions at once and set them all to Catch Up Automatically.

Installation Instructions · Download in Compiled Format · Download in Text Format

Script

on processAction(_action)
    tell
application "OmniFocus"
        set
_repetition to _action's repetition rule
        if
_repetition is missing value then return
        
        
-- This should work, but OmniFocus 4.8.7 has a bug where it doesn't save the changes
        set
_repetition's catch up automatically to true
        set
_action's repetition rule to _repetition
        
        
-- So work around that by using JavaScript. We have to create a new rule because the properties are read-only.
        set
actionID to _action's id
        
evaluate javascript "
task = Task.byIdentifier(" &
quoted form of actionID & ")
newRule = new Task.RepetitionRule(
task.repetitionRule.ruleString,
null, // deprecated `method` property replaced by `scheduleType`
task.repetitionRule.scheduleType,
task.repetitionRule.anchorDateKey,
true // catch up automatically
)
task.repetitionRule = newRule"
        
        
-- Test that it was actually set
        set
_newRule to _action's repetition rule
        if not
_newRule's catch up automatically then
            
display dialog "Change didn't get written back"
        end if
    end tell
end
processAction

on
run {}
    repeat with
_action in my selectedActions()
        my
processAction(_action)
    end repeat
end
run

on
selectedActions()
    tell
application "OmniFocus"
        return my
filterValues(my selectedValues(), {inbox task, task, available task, remaining task})
    end tell
end
selectedActions

on
selectedValues()
    tell
application "OmniFocus"
        return
value of selected trees of content of first document window of front document
    end tell
end
selectedValues

on
filterValues(_values, _classes)
    tell
application "OmniFocus"
        set
_result to {}
        repeat with
_value in _values
            if
_classes contains _value's class then
                copy
_value to end of _result
            end if
        end repeat
        return
_result
    end tell
end
filterValues