Además de proporcionar una interfaz basada en tarjetas cuando un usuario lee un mensaje de Gmail, los complementos de Google Workspace que extienden Gmail pueden proporcionar otra interfaz cuando el usuario redacta mensajes nuevos o responde a los existentes. Esto permite que los complementos de Google Workspace automaticen la tarea de redactar correos electrónicos para el usuario.
Cómo acceder a la IU de redacción del complemento
Existen dos formas de ver la IU de redacción de un complemento. La primera forma es comenzar a redactar un borrador o una respuesta nuevos mientras el complemento ya está abierto. La segunda forma es iniciar el complemento mientras redactas un borrador.
En ambos casos, el complemento ejecuta la función de activación de redacción correspondiente, definida en el manifiesto del complemento. La función de activación de redacción compila la IU de redacción para esa acción de redacción, que luego Gmail muestra al usuario.
Cómo compilar un complemento de redacción
Para agregar la funcionalidad de redacción a un complemento, sigue estos pasos generales:
- Agrega el campo
gmail.composeTriggeral manifiesto del proyecto de la secuencia de comandos del complemento y actualiza los alcances del manifiesto para incluir los que se requieren para las acciones de redacción. - Implementa una función de activación de redacción que compile una IU de redacción cuando se active el activador. Las funciones de activación de Compose devuelven un solo objeto
Cardo un array de objetosCardque comprenden la IU de Compose para la acción de composición. - Implementa las funciones de devolución de llamada asociadas necesarias para reaccionar a las interacciones del usuario con la IU de redacción. Estas funciones no son la acción de componer en sí (que solo hace que aparezca la IU de composición), sino las funciones individuales que rigen lo que sucede cuando se seleccionan diferentes elementos de la IU de composición. Por ejemplo, una tarjeta de la IU que contiene un botón suele tener una función de devolución de llamada asociada que se ejecuta cuando un usuario hace clic en ese botón. La función de devolución de llamada para los widgets que actualizan el contenido del mensaje de borrador debe devolver un objeto
UpdateDraftActionResponse.
Función de activación de composición
La IU de redacción de un complemento se compila de la misma manera que la IU de mensajes del complemento, con el servicio de tarjetas de Apps Script para construir tarjetas y completarlas con widgets.
Debes implementar el gmail.composeTrigger.selectActions[].runFunction que definas en tu manifiesto. La función de activación de composición debe devolver un solo objeto Card o un array de objetos Card que comprendan la IU de composición para esa acción. Estas funciones son muy similares a las funciones de activación contextual y deberían compilar tarjetas de la misma manera.
Cómo componer objetos de eventos de activación
Cuando se selecciona una acción de composición, se ejecuta la función de activación de composición correspondiente y se le pasa a la función un objeto de evento como parámetro. El objeto de evento puede contener información sobre el contexto del complemento y el borrador que se está redactando para la función de activación.
Consulta Estructura del objeto de evento para obtener detalles sobre cómo se organiza la información en el objeto de evento. La información que contiene el objeto de evento se controla parcialmente con el valor del campo de manifiesto gmail.composeTrigger.draftAccess:
Si el campo de manifiesto
gmail.composeTrigger.draftAccessesNONEo no se incluye, el objeto de evento solo tiene información mínima.Si
gmail.composeTrigger.draftAccessse establece enMETADATA, el objeto de evento que se pasa a la función de activación de redacción se completa con listas de destinatarios del correo electrónico que se está redactando.
Cómo insertar contenido en borradores activos
Por lo general, la IU de redacción de un complemento de Google Workspace proporciona opciones y controles al usuario que lo ayudan a redactar un mensaje. En estos casos de uso, una vez que el usuario realiza selecciones en la IU, el complemento interpreta las selecciones y actualiza el borrador de correo electrónico de trabajo actual según corresponda.
Para facilitar la actualización del borrador de correo electrónico actual, se extendió el servicio de tarjetas con las siguientes clases:
ContentType: Es una enumeración que define si se debe agregar HTML mutable, HTML inmutable (que los usuarios de Gmail no pueden editar) o contenido de texto sin formato.UpdateDraftActionResponse: Representa una respuesta a una acción que actualiza el borrador actual del correo electrónico.UpdateDraftActionResponseBuilder: Compilador para objetosUpdateDraftActionResponseUpdateDraftBodyAction: Representa una acción que actualiza el cuerpo del borrador de correo electrónico actual.UpdateDraftBodyType: Es una enumeración que define cómo se cambia el cuerpo.UpdateDraftSubjectAction: Representa una acción que actualiza el campo de asunto del borrador de correo electrónico actual.UpdateDraftToRecipientsAction: Representa una acción que actualiza los destinatarios Para del correo electrónico borrador actual.UpdateDraftCcRecipientsAction: Representa una acción que actualiza los destinatarios en Cc del borrador de correo electrónico actual.UpdateDraftBccRecipientsAction: Representa una acción que actualiza los destinatarios en Cco del borrador de correo electrónico actual.
Por lo general, la IU de redacción de un complemento incluye un widget de "Guardar" o "Insertar" en el que el usuario puede hacer clic para indicar que terminó de realizar selecciones en la IU y que desea que sus elecciones se agreguen al correo electrónico que está redactando. Para agregar esta interactividad, el widget debe tener un objeto Action asociado que le indique al complemento que ejecute una función de devolución de llamada específica cuando se haga clic en el widget. Debes implementar estas funciones de devolución de llamada. Cada función de devolución de llamada debe devolver un objeto UpdateDraftActionResponse compilado que detalle los cambios que se deben realizar en el borrador de correo electrónico actual.
Ejemplo 1
En el siguiente fragmento de código, se muestra cómo compilar una IU de Compose que actualiza el asunto y los destinatarios Para, Cc y Cco del borrador de correo electrónico actual.
/**
* Compose trigger function that fires when the compose UI is
* requested. Builds and returns a compose UI for inserting images.
*
* @param {event} e The compose trigger event object. Not used in
* this example.
* @return {Card[]}
*/
function getComposeUI(e) {
return [buildComposeCard()];
}
/**
* Build a card to display interactive buttons to allow the user to
* update the subject, and To, Cc, Bcc recipients.
*
* @return {Card}
*/
function buildComposeCard() {
var card = CardService.newCardBuilder();
var cardSection = CardService.newCardSection().setHeader('Update email');
cardSection.addWidget(
CardService.newTextButton()
.setText('Update subject')
.setOnClickAction(CardService.newAction()
.setFunctionName('applyUpdateSubjectAction')));
cardSection.addWidget(
CardService.newTextButton()
.setText('Update To recipients')
.setOnClickAction(CardService.newAction()
.setFunctionName('updateToRecipients')));
cardSection.addWidget(
CardService.newTextButton()
.setText('Update Cc recipients')
.setOnClickAction(CardService.newAction()
.setFunctionName('updateCcRecipients')));
cardSection.addWidget(
CardService.newTextButton()
.setText('Update Bcc recipients')
.setOnClickAction(CardService.newAction()
.setFunctionName('updateBccRecipients')));
return card.addSection(cardSection).build();
}
/**
* Updates the subject field of the current email when the user clicks
* on "Update subject" in the compose UI.
*
* Note: This is not the compose action that builds a compose UI, but
* rather an action taken when the user interacts with the compose UI.
*
* @return {UpdateDraftActionResponse}
*/
function applyUpdateSubjectAction() {
// Get the new subject field of the email.
// This function is not shown in this example.
var subject = getSubject();
var response = CardService.newUpdateDraftActionResponseBuilder()
.setUpdateDraftSubjectAction(CardService.newUpdateDraftSubjectAction()
.addUpdateSubject(subject))
.build();
return response;
}
/**
* Updates the To recipients of the current email when the user clicks
* on "Update To recipients" in the compose UI.
*
* Note: This is not the compose action that builds a compose UI, but
* rather an action taken when the user interacts with the compose UI.
*
* @return {UpdateDraftActionResponse}
*/
function applyUpdateToRecipientsAction() {
// Get the new To recipients of the email.
// This function is not shown in this example.
var toRecipients = getToRecipients();
var response = CardService.newUpdateDraftActionResponseBuilder()
.setUpdateDraftToRecipientsAction(CardService.newUpdateDraftToRecipientsAction()
.addUpdateToRecipients(toRecipients))
.build();
return response;
}
/**
* Updates the Cc recipients of the current email when the user clicks
* on "Update Cc recipients" in the compose UI.
*
* Note: This is not the compose action that builds a compose UI, but
* rather an action taken when the user interacts with the compose UI.
*
* @return {UpdateDraftActionResponse}
*/
function applyUpdateCcRecipientsAction() {
// Get the new Cc recipients of the email.
// This function is not shown in this example.
var ccRecipients = getCcRecipients();
var response = CardService.newUpdateDraftActionResponseBuilder()
.setUpdateDraftCcRecipientsAction(CardService.newUpdateDraftCcRecipientsAction()
.addUpdateToRecipients(ccRecipients))
.build();
return response;
}
/**
* Updates the Bcc recipients of the current email when the user clicks
* on "Update Bcc recipients" in the compose UI.
*
* Note: This is not the compose action that builds a compose UI, but
* rather an action taken when the user interacts with the compose UI.
*
* @return {UpdateDraftActionResponse}
*/
function applyUpdateBccRecipientsAction() {
// Get the new Bcc recipients of the email.
// This function is not shown in this example.
var bccRecipients = getBccRecipients();
var response = CardService.newUpdateDraftActionResponseBuilder()
.setUpdateDraftBccRecipientsAction(CardService.newUpdateDraftBccRecipientsAction()
.addUpdateToRecipients(bccRecipients))
.build();
return response;
}
Ejemplo 2
En el siguiente fragmento de código, se muestra cómo compilar una IU de Compose que inserta imágenes en el borrador de correo electrónico actual.
/**
* Compose trigger function that fires when the compose UI is
* requested. Builds and returns a compose UI for inserting images.
*
* @param {event} e The compose trigger event object. Not used in
* this example.
* @return {Card[]}
*/
function getInsertImageComposeUI(e) {
return [buildImageComposeCard()];
}
/**
* Build a card to display images from a third-party source.
*
* @return {Card}
*/
function buildImageComposeCard() {
// Get a short list of image URLs to display in the UI.
// This function is not shown in this example.
var imageUrls = getImageUrls();
var card = CardService.newCardBuilder();
var cardSection = CardService.newCardSection().setHeader('My Images');
for (var i = 0; i < imageUrls.length; i++) {
var imageUrl = imageUrls[i];
cardSection.addWidget(
CardService.newImage()
.setImageUrl(imageUrl)
.setOnClickAction(CardService.newAction()
.setFunctionName('applyInsertImageAction')
.setParameters({'url' : imageUrl})));
}
return card.addSection(cardSection).build();
}
/**
* Adds an image to the current draft email when the image is clicked
* in the compose UI. The image is inserted at the current cursor
* location. If any content of the email draft is currently selected,
* it is deleted and replaced with the image.
*
* Note: This is not the compose action that builds a compose UI, but
* rather an action taken when the user interacts with the compose UI.
*
* @param {event} e The incoming event object.
* @return {UpdateDraftActionResponse}
*/
function applyInsertImageAction(e) {
var imageUrl = e.parameters.url;
var imageHtmlContent = '<img style=\"display: block\" src=\"'
+ imageUrl + '\"/>';
var response = CardService.newUpdateDraftActionResponseBuilder()
.setUpdateDraftBodyAction(CardService.newUpdateDraftBodyAction()
.addUpdateContent(
imageHtmlContent,
CardService.ContentType.MUTABLE_HTML)
.setUpdateType(
CardService.UpdateDraftBodyType.IN_PLACE_INSERT))
.build();
return response;
}