This script creates a custom date register.
It can be used to create a wide range of date formats from a provided Start and End Date.
Default
The default is a YYYY/YYYY-MM/YYYY-MM-DD
register.
Customizing
If you want a custom date format
- Set property
createGroups
tofalse
- Read UTS #35: Unicode - 8 - Date Format Patterns
- Read A brief description of “create location”
- Set property
theDateFormat
to your desired Date Format - Test the script in Script Editor.app
- Set property
createGroups
totrue
Usage
- Select the destination group in the navigation sidebar
- Run the script
Examples
yyyy/yyyy-MM/yyyy-MM-dd
→ 2021/2021-03/2021-03-01
'Random string' yyyy/'Test' yyyy-MM/yyyy-MM-dd
→ Random string 2021/Test 2021-03/2021-03-01
yyyy/yyyy-MM/dd. MMMM yyyy
→ 2021/2021-03/01. März 2021
yyyy/QQQ yyyy/yyyy-MM/yyyy-MM-dd
→ 2021/Q1 2021/2021-03/2021-03-01
YYYY/'KW' ww YYYY/YYYY-MM-dd, E
→ 2021/KW 09 2021/2021-03-01, Mo.
Although it might seem redundant it’s a good idea to make sure that group names on each level are meaningful. DEVONthink is superb in finding stuff but that experience is easily destroyed if one routinely encounters groups with identical names in search results.
It’s of course not necessary to use the year at the start:
e EEEE/yyyy-MM/yyyy-MM-dd
→ 1 Montag/2021-03/2021-03-01
-- Create custom date register
-- Date Format Patterns: https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns
-- Examples:
-- "yyyy/yyyy-MM/yyyy-MM-dd" --> 2021/2021-03/2021-03-01
-- "'Random string' yyyy/'Test' yyyy-MM/yyyy-MM-dd" --> Random string 2021/Test 2021-03/2021-03-01
-- "yyyy/yyyy-MM/dd. MMMM yyyy" --> 2021/2021-03/01. März 2021
-- "yyyy/QQQ yyyy/yyyy-MM/yyyy-MM-dd" --> 2021/Q1 2021/2021-03/2021-03-01
-- "YYYY/'KW' ww YYYY/YYYY-MM-dd, E" --> 2021/KW 09 2021/2021-03-01, Mo.
-- "e EEEE/yyyy-MM/yyyy-MM-dd" --> 1 Montag/2021-03/2021-03-01
-- Note: If you use a slash "/" make sure to escape it "\\/"
use AppleScript version "2.4"
use framework "Foundation"
use scripting additions
property createGroups : true -- set to false while testing
property theDateFormat : "yyyy/yyyy-MM/yyyy-MM-dd" --> 2021/2021-03/2021-03-01
set theCalendar to current application's NSCalendar's currentCalendar()
set theCalendarOptions to current application's NSCalendarMatchNextTime
set theDefaultStartDate to current application's NSDate's |date|()
set theDateComponents to current application's NSDateComponents's alloc()'s init()
set theDateComponents's |day| to 1
set theDateComponents's |month| to 1
set theDefaultEndDate to theCalendar's nextDateAfterDate:theDefaultStartDate matchingComponents:theDateComponents options:theCalendarOptions
set theDateFormatter to current application's NSDateFormatter's alloc()'s init()
set theDateFormatter's timeZone to (current application's NSTimeZone's timeZoneWithName:"GMT")
set theDateFormatter's dateFormat to "yyyy-MM-dd"
tell application id "DNtp"
try
if not (exists viewer window 1) then error "Please open a window"
activate
set theStartDate to missing value
repeat while theStartDate = missing value
set theStartDate to theDateFormatter's dateFromString:(display name editor "Create Register" info "Start Date:" default answer ¬
(theDateFormatter's stringFromDate:theDefaultStartDate) as string)
end repeat
set theEndDate to missing value
repeat while theEndDate = missing value
set theEndDate to theDateFormatter's dateFromString:(display name editor "Create Register" info "End Date:" default answer ¬
(theDateFormatter's stringFromDate:theDefaultEndDate) as string)
end repeat
on error error_message number error_number
if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
return
end try
end tell
set theNSOrderedAscending to current application's NSOrderedAscending
if (theStartDate's compare:theEndDate) ≠ theNSOrderedAscending then set {theStartDate, theEndDate} to {theEndDate, theStartDate}
set theDateComponents's |month| to 0
set theDateFormatter's dateFormat to theDateFormat
set thisDate to theStartDate
set theDateStringArray to current application's NSMutableArray's arrayWithArray:{theDateFormatter's stringFromDate:theStartDate}
repeat
set thisDate to (theCalendar's dateByAddingComponents:theDateComponents toDate:thisDate options:theCalendarOptions)
if (theEndDate's compare:thisDate) ≠ theNSOrderedAscending then
(theDateStringArray's addObject:(theDateFormatter's stringFromDate:thisDate))
else
exit repeat
end if
end repeat
if createGroups = true then
script s
property theLocations : missing value
end script
set s's theLocations to theDateStringArray as list
tell application id "DNtp"
try
set theDatabase to current database
set theGroup to current group
if theGroup ≠ root of theDatabase then
set theGroupName to name of theGroup
if theGroupName contains "/" then set theGroupName to my escapeSlash(theGroupName)
set theGroupLocation to location of theGroup & theGroupName & "/"
else
set theGroupLocation to "/"
end if
set theContainerName to "Register"
if exists record at theGroupLocation & theContainerName in theDatabase then
set theDateFormatter's timeZone to current application's NSTimeZone's localTimeZone()
set theDateFormatter's dateFormat to "yyyy-MM-dd HH.mm.ss"
set theContainerName to theContainerName & space & ((theDateFormatter's stringFromDate:(current application's NSDate's |date|())) as string)
end if
show progress indicator "Creating Register... " steps (count (s's theLocations)) as string with cancel button
repeat with thisLocation in s's theLocations
step progress indicator thisLocation as string
create location theGroupLocation & theContainerName & "/" & thisLocation as string in theDatabase
end repeat
hide progress indicator
on error error_message number error_number
hide progress indicator
if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
return
end try
end tell
else
set theDateStringList to theDateStringArray as list
return item 1 of theDateStringList
end if
on escapeSlash(theText)
set d to AppleScript's text item delimiters
set AppleScript's text item delimiters to "/"
set theTextItems to every text item of theText
set AppleScript's text item delimiters to "\\/"
set theText_escaped to theTextItems as string
set AppleScript's text item delimiters to d
return theText_escaped
end escapeSlash