Auto create one note per day for entire month/year? (Bullet Journal)

HI,

Currently I’m creating notes manually with the following scheme
Jan 1,2021
Jan 2,2021
Jan 3 ,2021

Is there a way to automate the process ?

Rather than create notes for the whole year – here’s how to create a note just for today.

In your document, create a note that will be the top level container for the notes. Open the Action Inspector on the Action tab and add this action:

$Name=$Created.format("L");

This will now be the OnAdd action. Then you add a note to the container – say by selecting the “Journal” container and pressing ⇧↩ – you’ll get a new note named for today’s date.

Screenshot of Tinderbox (12-29-20, 6-56-38 AM)

In the OnAdd action. you can also assign prototypes, etc.

As you’ve 365 notes to make I’d consider using either the AppleScript interface or generate the day list in some coding tool then paste the list into the $Text of a note and explode it to generate all those notes.

Also consider how you’ll use those notes. Do you want a container with 365 notes or perhaps consider nesting the notes by year and month. You might also consider prototypes, as already covered here today to make it easier to customise all per-day notes. I’d also add a the day’s date into a Date-type attribute making the note easily accessible to date-based queries without having to parse the date from the note tittle. I’d make a new Date-type attribute ‘DayDate’. The attribute name indicates the role and the data type and its values won’t get mixed up with, for instance, $StartDate. You could use the latter, but likely you’d then keep having to filter in/out day notes as opposed to other $StartDate uses.

. There is an action method to create a note though I think the above suggestions are better choices. With an action, you’ve still got to calculate all the dates’ titles to pass to create().

A simple scheme is to set the name of the note using an OnAdd action.

For example, if you have a note ‘journal’, notes added as its children can have their name set by an Action:

$Name=date("today").format(L)

You can then add to or overwrite the name if not what you want as the action only triggers on adding the note.

See atbref for details of formatting.

There are many alternative approaches of course this being Tinderbox. This route assumes you create each note as you go rather than for a whole month or year.

2 Likes

Basically same as I posted up thread

1 Like

Snap.

1 Like

Some way to create a year of Tinderbox notes, each titles with the date, very roughly ordered from “how I’d do it” to “you could do this!”

  1. Add one note per day, and let the OnAdd action set the title to date("today")
  2. Let the OnAdd action assign the new note to the prototype “Daily Note”, and let a rule on the prototype set $MyDate |= $MyDate(prevSibling)+"1 day". Set $Name from MyDate. Then add as many notes as you like. (This is very spreadsheet-like)
  3. Let the OnAdd action assign the new note’s $MyDate from its sibling order: $MyDate=date(1,1,2021);$MyDate=$MyDate+($SiblingOrder.format(“l”)+" days"). Set $Name from MyDate. Then add as many notes as you like.
  4. Open your favorite spreadsheet. Set up a column of dates as you want them, Copy the column, and paste into a Tinderbox outline.
  5. Use AppleScript to make a year of dates.

I bet there are other ways, too!

Hi Guys,
Thanks again for posting all these myriad of ways to achieve my goal.

@PaulWalters @latinhypercube OnAdd action worked wonderful ! Your clear instructions helped me achieve this in 1 go.

@mwra my TB “guru” thank you, having date type attribute is indeed what I was thinking about too ,your clear concise instruction help always . Exploding notes working great too , I’m just figuring how to achieve proper spacing , separate question on this , if I’m confused.

@eastgate , I’ve managed to try #1,#4. Little confusion with 2 & 3 but I am confident I will figure it.

1 Like

Thanks for the feedback. It’s always nice to hear the suggestions worked. :smile:

I’ve managed to get #2 working , very elegant.

#3 is still eluding me.

If that is #3 in @eastgate’s post above, I think the issue is the first date call has the inputs in the wrong order. The comma-separated input form for date() uses descending order of date(year,month,day,[hour,min]). Note that the ‘hour’ and ‘min’ inputs are optional.

Thus I think the code for method #3 should be:

$MyDate = date(2021,1,1); $MyDate = $MyDate + ($SiblingOrder.format(“l”)+" days")

The .format("l") is not date formatting but a special case for Number.format() to coerce literal numbers to string characters, i.e. 2"2". This is because date calculations use strings.In the above, if the current notes $SiblingOrder were 12, the latter parentheses ($SiblingOrder.format(“l”)+" days") would evaluate as ("12 days") which would then cause $MyDate to be set 12 calendar days on from 1 January, i.e. for 12 January 2021.

Note this method only works if all day notes are in the same container. If you were using per-month containers, the above would work for January, whilst February and subsequent months’ containers would beed the opening date-setting code adjusted. February would use date(2021,2,1), March date(2021,3,1) and so on.