Plug-In: Append Mail Link to Note
Presents a form interface for entering the parameters used to create a mailto link (Recipient, Subject, CC, BCC, Body) that is appended to the note of the selected task. For the Body parameter “\n” will be replaced with a paragraph return. Provided values (except for the subject) will be retained and retrieved in subsequent uses.
Return to: OmniFocus Plug-In Collection
Append Mail Link to Note
/*{"type": "action","targets": ["omnifocus"],"author": "Otto Automator","identifier": "com.omni-automation.of.append-mail-link-to-note","version": "1.5","description": "Presents a form interface for entering the parameters used to create a mailto link (Recipient, Subject, CC, BCC, Body) that is appended to the note of the selected task. For the Body parameter “\n” will be replaced with a paragraph return.","label": "Append Mail Link to Note","shortLabel": "Add Mail Link","paletteLabel": "Add Mail Link","image": "envelope"}*/(() => {var preferences = new Preferences() // NO ID = PLUG-IN IDconst action = new PlugIn.Action(async function(selection, sender){// DEFAULTS// NOTE: subject is disabled so that the value is the title of the selected taskvar defaultLinkTitleValue = "(Mail Link)"var defaultRecipientValue = nullvar defaultCcValue = nullvar defaultBccValue = null//var defaultSubjectValue = nullvar defaultBodyValue = nullvar defaultShouldPlaceOnClipboard = falsevar linkTitleValue = preferences.readString("linkTitleValue")if(!linkTitleValue){linkTitleValue = defaultLinkTitleValue}// RETRIEVE STORED FORM PARMATER VALUESvar recipientValue = preferences.readString("recipientValue")if(!recipientValue){recipientValue = defaultRecipientValue}var ccValue = preferences.readString("ccValue")if(!ccValue){ccValue = defaultCcValue}var bccValue = preferences.readString("bccValue")if(!bccValue){bccValue = defaultBccValue}//var subjectValue = preferences.readString("subjectValue")//if(!subjectValue){subjectValue = defaultSubjectValue}var bodyValue = preferences.readString("bodyValue")if(!bodyValue){bodyValue = defaultBodyValue}var shouldPlaceOnClipboardValue = preferences.readBoolean("shouldPlaceOnClipboardValue")if(!shouldPlaceOnClipboardValue){shouldPlaceOnClipboardValue = defaultShouldPlaceOnClipboard}// OBJECT REFERENCE FOR SELECTED PROJECT/TASKvar item = selection.databaseObjects[0]// CREATE THE FORM AND ELEMENTSvar mailtoForm = new Form()var linkTitleInput = new Form.Field.String("linkTitle", "Link Title", linkTitleValue)var recipientsInput = new Form.Field.String("recipient", "Recipient", recipientValue)var ccInput = new Form.Field.String("cc", "Cc", ccValue)var bccInput = new Form.Field.String("bcc", "Bcc", bccValue)var subjectInput = new Form.Field.String("subject", "Subject", item.name)var bodyInput = new Form.Field.String("body", "Body", bodyValue)var clipboardInput = new Form.Field.Checkbox("shouldReplaceClipboard","Put link on clipboard",shouldPlaceOnClipboardValue)mailtoForm.addField(linkTitleInput)mailtoForm.addField(recipientsInput)mailtoForm.addField(ccInput)mailtoForm.addField(bccInput)mailtoForm.addField(subjectInput)mailtoForm.addField(bodyInput)mailtoForm.addField(clipboardInput)mailtoForm.validate = function(formObject){var recipient = formObject.values['recipient']var cc = formObject.values['cc']var bcc = formObject.values['bcc']if(recipient){if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(recipient)){recipientStatus = true} else {throw "ERROR: not a valid recipient address."}} else {throw "NOTE: A recipient address is required."}if(cc){if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(cc)){ccStatus = true} else {throw "ERROR: not a valid Cc address."}}if(bcc){if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(bcc)){bccStatus = true} else {throw "ERROR: not a valid Bcc address."}}return true}var formPrompt = "Mail Parameters:"var buttonTitle = "OK"var formObject = await mailtoForm.show(formPrompt, buttonTitle)// RETRIEVE VALUESvar linkTitle = formObject.values['linkTitle']var recipient = formObject.values['recipient']var cc = formObject.values['cc']var bcc = formObject.values['bcc']var subject = formObject.values['subject']var body = formObject.values['body']var shouldReplaceClipboard = formObject.values['shouldReplaceClipboard']// CONSRUCT MAILTO: URLvar args = [];if (cc){args.push('cc=' + cc);}if (bcc){args.push('bcc=' + bcc);}if (subject){args.push('subject=' + encodeURIComponent(subject));}if (body){args.push('body=' + encodeURIComponent(body).replaceAll("%5Cn","%0A"))}var url = 'mailto:' + recipientif (args.length > 0){url += '?' + args.join('&')}// CREATE THE LINK OBJECTlinkURL = URL.fromString(url)linkTitle = (linkTitle) ? linkTitle:defaultLinkTitleValue// APPEND TO NOTEif(app.userVersion.versionString.startsWith("4")){noteObj = item.noteTextlinkObj = new Text(linkTitle, noteObj.style)newLineObj = new Text("\n", noteObj.style)style = linkObj.styleForRange(linkObj.range)style.set(Style.Attribute.Link, linkURL)if (noteObj.string.length > 0){noteObj.append(newLineObj)}noteObj.append(linkObj)node = document.windows[0].content.selectedNodes[0]node.expandNote(false)} else {if (task.note.length === 0){task.appendStringToNote(url)} else {task.appendStringToNote(`\n${url}`)}}// PLACE ON CLIPBOARDif(shouldReplaceClipboard){Pasteboard.general.string = url}// STORE THE NEW VALUESpreferences.write("linkTitleValue", linkTitle)preferences.write("recipientValue", recipient)preferences.write("ccValue", cc)preferences.write("bccValue", bcc)preferences.write("bodyValue", body)preferences.write("shouldPlaceOnClipboardValue", shouldReplaceClipboard)});action.validate = function(selection, sender){items = selection.databaseObjects.filter(item => (item instanceof Project || item instanceof Task))return (items.length === 1)};return action;})();