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.composescope :https://www.googleapis.com/auth/gmail.addons.current.action.composeYou can use more a permissive scope instead, but should only do so if that scope is absolutely necessary.
-
Create an
Actionobject and associate it with a callback function you define. -
Call the widget's
setComposeAction()widget handler function , providing it theActionobject 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
GmailDraftobject. - Build a
ComposeActionResponseobject using theComposeActionResponseBuilderclass and theGmailDraftobject. - 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.
var
composeAction
=
CardService
.
newAction
()
.
setFunctionName
(
'createReplyDraft'
);
var
composeButton
=
CardService
.
newTextButton
()
.
setText
(
'Compose Reply'
)
.
setComposeAction
(
composeAction
,
CardService
.
ComposedEmailType
.
REPLY_AS_DRAFT
);
//
...
/**
*
Creates
a
draft
email
(
with
an
attachment
and
inline
image
)
*
as
a
reply
to
an
existing
message
.
*
@
param
{
Object
}
e
An
event
object
passed
by
the
action
.
*
@
return
{
ComposeActionResponse
}
*/
function
createReplyDraft
(
e
)
{
//
Activate
temporary
Gmail
scopes
,
in
this
case
to
allow
//
a
reply
to
be
drafted
.
var
accessToken
=
e
.
gmail
.
accessToken
;
GmailApp
.
setCurrentMessageAccessToken
(
accessToken
);
//
Creates
a
draft
reply
.
var
messageId
=
e
.
gmail
.
messageId
;
var
message
=
GmailApp
.
getMessageById
(
messageId
);
var
draft
=
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
()
}
}
);
//
Return
a
built
draft
response
.
This
causes
Gmail
to
present
a
//
compose
window
to
the
user
,
pre
-
filled
with
the
content
specified
//
above
.
return
CardService
.
newComposeActionResponseBuilder
()
.
setGmailDraft
(
draft
)
.
build
();
}

