Hoy vamos a aprender como enviar un mail con archivos adjuntos desde Google Sheets
Enviando un correo básico
Ya vimos en otro artículo como enviar un correo desde Sheets, conectándose con Gmail
Es una línea muy sencilla
MailApp.sendEmail(mail,asunto,mensaje)
Aquí un ejemplo real
function enviarCorreoConAdjuntos() { MailApp.sendEmail("jsguzmanb@gmail.com","Asunto de prueba","Mensaje de prueba");
}
Opciones adicionales para el envío de correos
Hasta ahí todo bien
Sin embargo podemos mejorar nuestros correos con opciones adicionales
Entre estas opciones están:
- Agregar un mensaje Html
- Poner un nombre
- Determinar si no se puede responder este correo
- Determinar desde que correo enviarlo (si manejamos alias)
- Incluir correos en copia
- Incluir correos en copia oculta
- Incluir archivos adjuntos
Para esto vamos a usar un cuarto argumento de opciones que consiste en un corchete y dentro de los corchetes van las opciones así:
MailApp.sendEmail("jsguzmanb@gmail.com",
"Asunto de prueba",
"Mensaje de prueba",
{name:"Correo de Prueba",
cc:"pedritoq@gmail.com",
bcc:"juanchito@gmail.com",
htmlBody:"<h1>Hola!</h1>",
noReply:true,
replyTo:"info@juansguzman.com",
attachments:archivo
})
Despues te cuento acerca de las otras opciones (Muchas se explican solas).
Pero hoy me voy a concentrar en el tema de los adjuntos. Entonces hablemos de la opción attachments
MailApp.sendEmail("jsguzmanb@gmail.com",
"Asunto de prueba",
"Mensaje de prueba",
{
attachments:[blob]
})
Attachments es un arreglo de archivos
Cada archivo debe ser lo que se conoce como un blob, que no es más que un tipo de archivo específico
Los blobs se pueden crear de cero, o convertir a partir de otros archivos
Podemos crear blobs con cualquier texto con la función Utilities.newBlob()
Esta función tiene 3 argumentos:
- El texto que va a ir en el archivo
- El tipo de archivo
- El título
Aquí creamos un archivo de texto
var blob = Utilities.newBlob("Hola Mundo",MimeType.PLAIN_TEXT,"Mi primer texto Hola Mundo");
Y aquí creamos un PDF
var blob = Utilities.newBlob("Hola Mundo",MimeType.PDF,"Mi primer texto Hola Mundo");
Tambien podemos crear blobs a partir de documentos
Aquí podemos usar dos funciones: getBlob() y getAs();
La primera no tiene mas argumentos, a la segunda hay que incluirle el tipo de archivo
Aquí hacemos un ejemplo con un libro de Sheets
var libro=SpreadsheetApp.getActiveSpreadsheet();
var blob = libro.getBlob();
Y aquí un ejemplo con un documento de Google Docs
docId="1pBo9yiWGx67675hMx7iQuW76uoKSQLuYrhAx"
const archivoDoc=DriveApp.getFileById(docId);
pdfBlob = archivoDoc.getAs(MimeType.PDF);
Fíjate que en estos casos no tengo que «exportar» el archivo a Drive ni a ningun lado
Todo se crea dentro del codigo y se destruye al momento de enviarse el correo
Resumiendo, primero creamos el archivo en una variable blob, y despues incluimos este blob en la opción attachment del método sendMail()
Adjuntando archivos de Drive
Una segunda opción es traer archivos de Drive y adjuntarlos
Hay varias formas de traer los archivos a nuestro código
La forma más fácil es teniendo el id del archivo con .getFileById()
Una vez traemos el archivo, lo convertimos a blob con la funcion getAs
Aquí un ejemplo:
function enviarCorreoConAdjuntos() {
const archivo=DriveApp.getFileById("1tyGGMqcnamrJfzi88r-1PYimOfjqZZlK")
const blob=archivo.getAs(MimeType.PDF)
MailApp.sendEmail("jsguzmanb@gmail.com",
"Asunto de prueba",
"Mensaje de prueba",
{
attachments: [blob]
});
}
No hay necesidad de crear el blob por aparte, podemos acortar nuestro código así
function enviarCorreoConAdjuntos() {
const archivo=DriveApp.getFileById("1tyGGMqcnamrJfzi88r-1PYimOfjqZZlK")
con
MailApp.sendEmail("jsguzmanb@gmail.com",
"Asunto de prueba",
"Mensaje de prueba",
{
attachments: archivo.getAs(MimeType.PDF)
});
}
Adjuntar archivo desde Sheets con el id
Este método anterior funciona muy bien para cuando solo tenemos un archivo y ese es el que siempre vamos a adjuntar, como por ejemplo el brochure de la empresa
Pero en otros casos vamos a querer estar cambiando el id del adjunto en el código, y puede ser desgastante operativamente.
En estos casos sería más fácil poder pegar el id en una celda al frente del email y enviarlo con un botón

El código en este caso sería
function enviarCorreoConAdjuntos() {
//Conexión con Sheets
const hoja=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Datos")
//Traer email y adjunto
const email=hoja.getRange('A2').getValue()
const idArchivo=hoja.getRange('B2').getValue()
//Traer archivo
const archivo=DriveApp.getFileById(idArchivo)
//Generar blob
const blob=archivo.getAs(MimeType.PDF)
//Enviar mail
MailApp.sendEmail(email,
"Asunto de prueba","Mensaje de prueba", {attachments: [blob]
});
}
Adjuntar archivo desde Sheets con el url
La verdad es que traer este id puede ser desgastante y da para errores.
Podemos extraer este id de la URL con una fórmula de expresión regular así:
=REGEXEXTRACT(B2;»d/(\w+)»)
Así quedaría nuestra base

Y simplemente cambiamos la celda de donde saca el ID en nuestro código
//Traer adjunto
const idArchivo=hoja.getRange('B3').getValue()
Claro que esta operación de extracción también la podemos hacer directamente desde el código así, sin necesidad de tener otra columna
//Traer adjunto
var idArchivo=hoja.getRange('B2').getValue()
idArchivo=idArchivo.match(/d\/([0-9A-Za-z_]+)/)[1];
Enviar desde cualquier fila
Ahora imagina que tenemos una tabla con varios correos y varios adjuntos distintos
Quiero enviar al correo de la fila en la que este parado así:

El código sería
function enviarCorreoConAdjuntosDeEstaFila() {
const hoja=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Datos")
const rangoActivo=hoja.getActiveRange();
const filaActiva=rangoActivo.getRow()
const email=hoja.getRange(filaActiva,1).getValue()
var idArchivo=hoja.getRange(filaActiva,2).getValue()
idArchivo=idArchivo.match(/d\/([0-9A-Za-z_]+)/)[1];
const archivo=DriveApp.getFileById(idArchivo)
const blob=archivo.getAs(MimeType.PDF)
MailApp.sendEmail(email,
"Asunto de prueba",
"Mensaje de prueba",
{
attachments: [blob]
});
}
Enviar múltiples correos
Ahora quiero enviar correos a todos los de la lista con su respectivo adjunto.
El codigo sería así:
function enviarCorreosMasivosConAdjuntos() {
const hoja = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Datos")
const rango = hoja.getDataRange();
for (i = 2; i <= rango.getLastRow(); i++) {
const email = hoja.getRange(i, 1).getValue()
var idArchivo = hoja.getRange(i, 2).getValue()
idArchivo = idArchivo.match(/d\/([0-9A-Za-z_]+)/)[1];
const archivo = DriveApp.getFileById(idArchivo)
const blob = archivo.getAs(MimeType.PDF)
MailApp.sendEmail(email,
"Asunto de prueba",
"Mensaje de prueba",
{
attachments: [blob]
});
}
}
Conclusión
Enviar adjuntos puede ser intimidante al principio, pero como todo, después de practicar y equivocarse algunas veces, cada vez te sentirás más cómodo haciéndolo.
Suscríbete para acceder al curso «Descubriendo el poder de Google Sheets» y empezar tu camino a la maestría de Sheets, Forms y Apps Script
Deja una respuesta