Action
create draft from event
created by @FlohGro / more on my Blog
Create a new draft from current calendar event.
If several events are on your calendar(s) you can select the event you want from a prompt.
Configuration Options
change the content of the template tags to change the behavior of the action by editing the Define Template Tag
steps of it (DO NOT RENAME THE Template Tag, only edit the content)
calendars_to_exclude
: exclude calendars by writing their exact names in a new line for each calendar the action should not look intotags_to_add
: the action can add tags to the created draft. add each tag it should add into a new line
If you find this useful and want to support me you can donate or buy me a coffee
Steps
-
defineTemplateTag
name calendars_to_exclude
template -
defineTemplateTag
name tags_to_add
template -
script
// create draft from selected event with event details meeting // Find all calendars let calendars = Calendar.getAllCalendars(); const calendarsToExclude = draft.processTemplate("[[calendars_to_exclude]]").split("\n").map((val) => val.trim()) const tagsToAdd = draft.processTemplate("[[tags_to_add]]").split("\n").map((val) => val.trim()) // Check if there is a calendar event that is about to start, is currently running or just ended let events = []; calendars.forEach(function (calendar) { if (calendarsToExclude.includes(calendar.title)) { return } let calendarEvents = calendar.events(Date.today(), Date.today().addDays(1)); calendarEvents.filter(function (event) { return eventIsWithinTimeLimits(event) }).forEach(function (event) { events.push(event); }); }); if (events.length === 0) { // If there are no events found, display a message and stop the script alert("No events found."); } else if (events.length === 1) { // If there is only one event, create a new draft with its information createDraftFromEvent(events[0]); } else { // sort events by start time events.sort((a, b) => a.startDate.getTime() - b.startDate.getTime()) // If there are multiple events, prompt the user to select one let p = Prompt.create(); p.title = "Select an event"; events.forEach(function (event) { p.addButton(event.title, event); }); if (p.show()) { let selectedEvent = p.buttonPressed; createDraftFromEvent(selectedEvent); } else { app.displayInfoMessage("aborted by user") context.cancel("aborted by user") } } function createDraftFromEvent(event) { // Create a new draft with the event information let newDraft = Draft.create(); // iso date & event title newDraft.content = `# ${event.startDate.toISOString().substring(0, 10)} ${event.title}\n\n`; // metadata newDraft.content += `| info | details |\n|:-----|:------------|\n` // Calendar //newDraft.content += `**Calendar:** ${event.calendar.title}\n\n`; if (event.isAllDay) { newDraft.content += `| when | all day |\n`; } else { newDraft.content += `| when | ${event.startDate.toLocaleTimeString('en-US', { hour12: false }).substring(0, 5)}-${event.endDate.toLocaleTimeString('en-US', { hour12: false }).substring(0, 5)} |\n`; } if (event.location) { newDraft.content += `| where | ${event.location} |\n`; } if (event.attendees.length > 0) { newDraft.content += `| who | ${event.attendees.map(attendee => attendee.name).join(', ')} |\n`; } newDraft.content += `\n## Notes\n\n` tagsToAdd.map((tag) => newDraft.addTag(tag)); newDraft.update(); // Load the newly created draft editor.load(newDraft); } function formatDuration(startDate, endDate) { let duration = Math.abs(endDate.getTime() - startDate.getTime()) / 1000; let hours = Math.floor(duration / 3600); let minutes = Math.floor((duration % 3600) / 60); let seconds = duration % 60; if (hours > 0) { return `${hours} hours ${minutes} minutes`; } else if (minutes > 0) { return `${minutes} minutes ${seconds} seconds`; } else { return `${seconds} seconds`; } } function eventIsWithinTimeLimits(event) { // 15 minutes (after an event finished, present it anyways) const gracePeriod = 15 * 60 * 1000 const startTime = event.startDate.getTime(); const endTime = event.endDate.getTime(); const now = new Date().getTime(); return (startTime - now) <= 60 * 60 * 1000 && now <= (endTime + gracePeriod); }
Options
-
After Success Default , Tags: testingtag Notification Info Log Level Info
Items available in the Drafts Directory are uploaded by community members. Use appropriate caution reviewing downloaded items before use.