×

Plug-In: Schedule Medication

This plug-in will create a project with sequential tasks for tracking doses during the course of a medication.

Screenshot

NOTE: The OmniFocus Voice Commands Collection contains a matching voice command for this plug-in.

Return to: OmniFocus Plug-In Collection

Schedule Medication
 

/*{ "type": "action", "targets": ["omnifocus"], "author": "Otto Automator", "identifier": "com.omni-automation.of.schedule-medication-course", "version": "1.0", "description": "Creates a project with sequential tasks for tracking the course of a medication.", "label": "Schedule Medication", "shortLabel": "Schedule Medication", "paletteLabel": "Schedule Medication", "image": "calendar.badge.clock" }*/ (() => { const action = new PlugIn.Action(function(selection, sender){ (async () => { var projectTitleField = new Form.Field.String( "projectTitle", "Medication Name", null, null ) var startDayMenu = new Form.Field.Option( "startDay", "Start", ["Today", "Tomorrow"], ["Today", "Tomorrow"], "Today" ) var times = ["1:00", "2:00", "3:00", "4:00", "5:00", "6:00", "7:00", "8:00", "9:00", "10:00", "11:00", "12:00"] var timeIndexes = times.map((item, index) => index) var timesMenu = new Form.Field.Option( "startTime", "Initial Dose", times, times, "1:00" ) var meridiemMenu = new Form.Field.Option( "meridiemOption", "AM/PM", ["AM", "PM"], ["AM", "PM"], "AM" ) var courseDurationMenu = new Form.Field.Option( "courseDuration", "Number of Days", ["5", "7", "10", "12", "28", "30"], ["5", "7", "10", "12", "28", "30"], "7" ) var timesPerDayMenu = new Form.Field.Option( "timesPerDay", "Times per Day", ["1", "2", "3", "4"], ["1", "2", "3", "4"], "1" ) var inputForm = new Form() inputForm.addField(projectTitleField) inputForm.addField(startDayMenu) inputForm.addField(timesMenu) inputForm.addField(meridiemMenu) inputForm.addField(courseDurationMenu) inputForm.addField(timesPerDayMenu) inputForm.validate = function(formObject){ var projectTitle = formObject.values['projectTitle'] return (!projectTitle) ? false:true } var formPrompt = "Select parameters for this medication:" var buttonTitle = "Continue" var formObject = await inputForm.show(formPrompt, buttonTitle) var projectTitle = formObject.values["projectTitle"] var startDay = formObject.values["startDay"] var startTime = formObject.values["startTime"] var meridiemOption = formObject.values["meridiemOption"] var targetDate = new Date() if (startDay === "Tomorrow"){ targetDate = new Date(targetDate.setHours(24, 0, 0, 0)) } var dateString = targetDate.toLocaleDateString() var startDueDate = new Date(dateString + " " + startTime + " " + meridiemOption) var courseDuration = Number(formObject.values["courseDuration"]) var courseDurationString = String(courseDuration) var timesPerDay = Number(formObject.values["timesPerDay"]) var timeInterval = 24 / timesPerDay var timeIntervalString = String(timeInterval) var dosageCount = courseDuration * timesPerDay var dosageCountString = String(dosageCount) var dc = Calendar.current.dateComponentsFromDate(startDueDate) dc.day = dc.day + courseDuration var completionDate = Calendar.current.dateFromDateComponents(dc) var completionDateString = completionDate.toLocaleDateString() var project = new Project(`${projectTitle} (${courseDurationString}-day to ${completionDateString})`) project.sequential = true project.completedByChildren = true var taskDueDateTime = startDueDate.getTime() var millisecondsToAdd = timeInterval * 3600000 for (var i = 0; i < dosageCount; i++) { var task = new Task(`Dose ${i + 1}`, project) if (i !== 0){ taskDueDateTime = taskDueDateTime + millisecondsToAdd } var newDueDate = new Date(taskDueDateTime) task.dueDate = newDueDate } document.windows[0].perspective = Perspective.BuiltIn.Projects document.windows[0].focus = [project] })().catch(err => { if (!err.message.includes("was cancelled")){ new Alert(err.name, err.message).show() } }) }); action.validate = function(selection, sender){ return true }; return action; })();