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.compose- You 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 the- Actionobject and specifying the- ComposeEmailType.
- 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();
  }