Importing OmniFocus Projects
Simply copy the following script(s) into a new "Script Editor" document and press run.
After pasting them, consider saving the scripts to disk for future re-use. You could even save them to iCloud Drive (or e.g. Dropbox or Google Drive) to have them available on all your Macs.
Feel free to customize them for your use cases; if you need details on how a particular method works, please refer
to our AppleScript reference.
Note: We do not take responsibility for any data loss incurred by running these scripts.
Make sure to back up your data (e.g. by copying the directories mentioned here to a different location) before running these scripts.
Importing the Complete Project Hierarchy
-- Copyright (c) 2025 Timing Software GmbH. All rights reserved.
-- This script is licensed only to extend the functionality of Timing. Redistribution and any other uses are not allowed without prior permission from us.
tell application "TimingHelper"
if not advanced scripting support available then
error "This script requires a Timing Connect subscription. Please contact support via https://timingapp.com/contact to upgrade."
end if
end tell
-- Set this to false if you'd also like to include e.g. completed projects.
property activeProjectsOnly : true
set alertResult to display alert "Please back up your data!" message "Before proceeding, please make sure to back up your Timing database.\n\nSee https://timingapp.com/help/faq#data on which folders you need to back up." buttons {"Cancel", "I Have A Backup"}
if button returned of alertResult is "Cancel" then
error number -128
end if
on getOrCreateProject(projectName, parentProject)
if projectName = "" then
return missing value
end if
tell application "TimingHelper"
if parentProject is missing value then
set results to (projects whose name is projectName)
if results = {} then
return (create project name projectName)
else
return (first item of results)
end if
else
set results to (projects of parentProject whose name is projectName)
if results = {} then
return (create project name projectName parent project parentProject)
else
return (first item of results)
end if
end if
end tell
end getOrCreateProject
on importFolders(omniFocusFolders, timingParentProject)
repeat with omniFocusFolder in omniFocusFolders
set shouldAddFolder to false
tell application "OmniFocus"
set folderName to name of omniFocusFolder
set childSections to sections of omniFocusFolder
set childFolders to folders of omniFocusFolder
if activeProjectsOnly then
repeat with subProject in flattened projects of omniFocusFolder
if status of subProject is active then
set shouldAddFolder to true
exit repeat
end if
end repeat
else
set shouldAddFolder to true
end if
end tell
if shouldAddFolder then
set timingProject to getOrCreateProject(folderName, timingParentProject)
importProjects(childSections, timingProject)
importFolders(childFolders, timingProject)
end if
end repeat
end importFolders
on importProjects(omniFocusProjects, timingParentProject)
repeat with omniFocusProject in omniFocusProjects
set shouldAddProject to false
tell application "OmniFocus"
set projectName to name of omniFocusProject
if activeProjectsOnly then
if class of omniFocusProject is folder then
repeat with subProject in flattened projects of omniFocusProject
if status of subProject is active then
set shouldAddProject to true
exit repeat
end if
end repeat
else
set shouldAddProject to ((status of omniFocusProject) is active)
end if
else
set shouldAddProject to true
end if
end tell
if shouldAddProject then
getOrCreateProject(projectName, timingParentProject)
end if
end repeat
end importProjects
tell application "OmniFocus"
set rootSections to sections of front document
set rootFolders to folders of front document
end tell
importProjects(rootSections, missing value)
importFolders(rootFolders, missing value)
Importing All Selected Projects And Folders (Without Hierarchy)
-- Copyright (c) 2025 Timing Software GmbH. All rights reserved.
-- This script is licensed only to extend the functionality of Timing. Redistribution and any other uses are not allowed without prior permission from us.
tell application "TimingHelper"
if not advanced scripting support available then
error "This script requires a Timing Connect subscription. Please contact support via https://timingapp.com/contact to upgrade."
end if
end tell
set alertResult to display alert "Please back up your data!" message "Before proceeding, please make sure to back up your Timing database.\n\nSee https://timingapp.com/help/faq#data on which folders you need to back up." buttons {"Cancel", "I Have A Backup"}
if button returned of alertResult is "Cancel" then
error number -128
end if
on getOrCreateProject(projectName, parentProject)
if projectName = "" then
return missing value
end if
tell application "TimingHelper"
if parentProject is missing value then
set results to (projects whose name is projectName)
if results = {} then
return (create project name projectName)
else
return (first item of results)
end if
else
set results to (projects of parentProject whose name is projectName)
if results = {} then
return (create project name projectName parent project parentProject)
else
return (first item of results)
end if
end if
end tell
end getOrCreateProject
set projectNames to {}
tell application "OmniFocus"
set theDoc to front document
set allTreeProperties to properties of value of every selected tree of sidebar of front document window of theDoc
repeat with treeProperties in allTreeProperties
copy name of treeProperties to the end of projectNames
end repeat
end tell
repeat with projectName in projectNames
getOrCreateProject(projectName, missing value)
end repeat