Composing draft messages
Stay organized with collections
Save and categorize content based on your preferences.
AI-generated Key Takeaways
-
This guide explains how to use Google Workspace add-ons to create new email drafts prefilled with information from the add-on or the currently open message.
-
Add-ons achieve this functionality by using actions associated with widgets like buttons, triggering callback functions to build and return drafts.
-
To implement this, you need to include a specific scope in your manifest, create an action object with a callback function, and configure the widget to trigger the action.
-
The callback function creates a GmailDraft object, builds a ComposeActionResponse, and can prefill the draft with data from various sources.
-
Drafts can be created as standalone messages or replies (single or reply-all) using corresponding Gmail service functions.
In a Google Workspace add-on you can create widgets that have linked actions. You can use an action to compose new email drafts, optionally filling them using information entered into the add-on UI or information from an open message. For example, you can have a button in your add-on's message UI that creates a reply to the currently opened message prepopulated with information from the add-on.
When an action that builds messages is triggered, Gmail executes a callback function to build and return the draft. Gmail then displays that draft in its UI in a standard email compose window, which the user can then edit and send as needed.
Configuring an action to build a draft message
To configure a widget to start a draft-building action when selected, you must do the following:
Make sure your manifest includes the
action.compose
scope:https://www.googleapis.com/auth/gmail.addons.current.action.compose
You can use more a permissive scope instead, but should only do so if that scope is absolutely necessary.
Create an
Action
object and associate it with a callback function you define.Call the widget's
setComposeAction()
widget handler function, providing it theAction
object and specifying theComposeEmailType
.Implement the callback function that executes the draft-building action. This function is given an event object as an argument. The callback function must do the following:
- Create a
GmailDraft
object. - Build a
ComposeActionResponse
object using theComposeActionResponseBuilder
class and theGmailDraft
object. - Return the built
ComposeActionResponse
.
- Create a
You can prefill the GmailDraft
you create in the callback function with
recipients, a subject, a message body, and attachments. To fill in the draft,
data can come from any source, but typically it derives from information
provided to the add-on itself, information in the open message, or
information gathered from a third-party service. The
event object
passed to the callback function contains the open message ID and other add-on
information you can use to prefill the draft.
You can create the draft as a new standalone message or a reply to
an existing message. This is controlled by the
ComposeEmailType
enum given to the
setComposeAction()
.
You can create reply drafts as single replies or 'reply-all' messages.
Standalone drafts
A standalone draft starts a new thread and isn't a reply to any existing message. You can create a standalone draft with one of the following Gmail service functions:
GmailApp.createDraft(recipient, subject, body)
GmailApp.createDraft(recipient, subject, body, options)
Reply drafts
A reply draft is part of an existing message thread. Reply drafts are either single replies that only get sent to the sender of a message or "reply all" drafts that get sent to everyone who received that message. You can create a reply draft with one of these Gmail service functions:
GmailMessage.createDraftReply(body)
GmailMessage.createDraftReply(body, options)
GmailMessage.createDraftReplyAll(body)
GmailMessage.createDraftReplyAll(body, options)
GmailThread.createDraftReply(body)
GmailThread.createDraftReply(body, options)
GmailThread.createDraftReplyAll(body)
GmailThread.createDraftReplyAll(body, options)
Example
The following code snippet shows how to assign an action that builds a reply draft to a button.
varcomposeAction=CardService.newAction()
.setFunctionName('createReplyDraft');
varcomposeButton=CardService.newTextButton()
.setText('Compose Reply')
.setComposeAction(
composeAction,
CardService.ComposedEmailType.REPLY_AS_DRAFT);
//...
/**
*Createsadraftemail(withanattachmentandinlineimage)
*asareplytoanexistingmessage.
*@param{Object}eAneventobjectpassedbytheaction.
*@return{ComposeActionResponse}
*/
functioncreateReplyDraft(e){
//ActivatetemporaryGmailscopes,inthiscasetoallow
//areplytobedrafted.
varaccessToken=e.gmail.accessToken;
GmailApp.setCurrentMessageAccessToken(accessToken);
//Createsadraftreply.
varmessageId=e.gmail.messageId;
varmessage=GmailApp.getMessageById(messageId);
vardraft=message.createDraftReply('',
{
htmlBody:"Kitten! <img src='cid:kitten'/>",
attachments:[
UrlFetchApp.fetch('https://example.com/images/myDog.jpg')
.getBlob()
],
inlineImages:{
"kitten":UrlFetchApp.fetch('https://example.com/images/myKitten.jpg')
.getBlob()
}
}
);
//Returnabuiltdraftresponse.ThiscausesGmailtopresenta
//composewindowtotheuser,pre-filledwiththecontentspecified
//above.
returnCardService.newComposeActionResponseBuilder()
.setGmailDraft(draft).build();
}