Envía certificados de agradecimiento personalizados a los empleados

Nivel de programación: Principiante
Duración: 15 minutos
Tipo de proyecto: Automatización con un menú personalizado

Objetivos

  • Comprender qué hace la solución
  • Comprender qué hacen los servicios de Apps Script dentro de la solución
  • Configura el entorno.
  • Configura la secuencia de comandos.
  • Ejecuta la secuencia de comandos.

Acerca de esta solución

Personaliza automáticamente la plantilla de Certificado de empleado de Presentaciones de Google con los datos de los empleados en Hojas de cálculo de Google y, luego, envía los certificados con Gmail.

Creación de certificados de empleados

Cómo funciona

La secuencia de comandos usa la plantilla de presentación de certificados de empleado de Presentaciones y una hoja de cálculo de Hojas de cálculo con los detalles del empleado. La secuencia de comandos copia la plantilla y reemplaza los marcadores de posición con datos de la hoja de cálculo. Una vez que la secuencia de comandos crea una diapositiva para cada empleado, extrae cada diapositiva individual como archivo adjunto en PDF y envía los certificados a los empleados.

Servicios de Apps Script

En esta solución, se usan los siguientes servicios:

  • Servicio de Drive: Copia la plantilla de Certificado de empleado de diapositivas.
  • Servicio de hoja de cálculo: Proporciona los detalles del empleado y actualiza el estado de cada empleado de la lista.
  • Servicio de Presentaciones: Reemplaza los marcadores de posición de la presentación por los datos de los empleados de la hoja de cálculo.
  • Servicio de Gmail: Obtiene las diapositivas individuales como archivos PDF y las envía a los empleados.

Requisitos previos

Para usar esta muestra, debes cumplir con los siguientes requisitos previos:

  • Una Cuenta de Google (es posible que las cuentas de Google Workspace requieran aprobación del administrador)
  • Un navegador web con acceso a Internet

Configura tu entorno

  1. Haz clic en el siguiente botón para crear una copia de la plantilla de Presentaciones Certificados para empleados.
    Crear una copia

  2. Anota el ID de la presentación para usarlo en un paso posterior. Puedes encontrar el ID en la URL:

    https://docs.google.com/presentation/d/PRESENTATION_ID/edit

  3. En Drive, crea una carpeta nueva para contener los certificados.

  4. Toma nota del ID de la carpeta para usarlo en un paso posterior. Puedes encontrar el ID en la URL: https://drive.google.com/drive/folders/FOLDER_ID.

Configura la secuencia de comandos

  1. Haz clic en el siguiente botón para crear una copia de la hoja de cálculo de muestra de Certificados de los empleados. El proyecto de Apps Script para esta solución se adjunta a la hoja de cálculo.
    Crear una copia

  2. En la hoja de cálculo, abre el proyecto de Apps Script haciendo clic en Extensiones > Apps Script.

  3. Para la variable slideTemplateId, reemplaza PRESENTATION_ID por el ID de tu presentación.

  4. Para la variable tempFolderId, reemplaza FOLDER_ID por el ID de tu carpeta.

  5. Haz clic en Guardar Ícono de guardar.

Ejecuta la secuencia de comandos:

  1. Regresa a la hoja de cálculo y haz clic en Agradecimiento > Crear certificados. Es posible que debas actualizar la página para que aparezca este menú personalizado.
  2. Cuando se te solicite, autoriza la secuencia de comandos. Si la pantalla de consentimiento de OAuth muestra la advertencia Esta app no está verificada, continúa seleccionando Avanzado > Ir a {nombre del proyecto} (no seguro).

  3. Haz clic en Agradecimiento > Crear certificados otra vez.

  4. Una vez que la columna de estado de todas las filas se haya actualizado a Created, haz clic en Appreciation > Send certificates.

Revisa el código

Para revisar el código de Apps Script de esta solución, haz clic en Ver código fuente a continuación:

Ver el código fuente

Code.gs

solutions/automations/employee-certificate/Code.js
// To learn how to use this script, refer to the documentation:
// https://developers.google.com/apps-script/samples/automations/employee-certificate

/*
Copyright 2022 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

const slideTemplateId = 'PRESENTATION_ID';
const tempFolderId = 'FOLDER_ID'; // Create an empty folder in Google Drive

/**
 * Creates a custom menu "Appreciation" in the spreadsheet
 * with drop-down options to create and send certificates
 */
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('Appreciation')
      .addItem('Create certificates', 'createCertificates')
      .addSeparator()
      .addItem('Send certificates', 'sendCertificates')
      .addToUi();
}

/**
 * Creates a personalized certificate for each employee
 * and stores every individual Slides doc on Google Drive
 */
function createCertificates() {
  // Load the Google Slide template file
  const template = DriveApp.getFileById(slideTemplateId);

  // Get all employee data from the spreadsheet and identify the headers
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const values = sheet.getDataRange().getValues();
  const headers = values[0];
  const empNameIndex = headers.indexOf('Employee Name');
  const dateIndex = headers.indexOf('Date');
  const managerNameIndex = headers.indexOf('Manager Name');
  const titleIndex = headers.indexOf('Title');
  const compNameIndex = headers.indexOf('Company Name');
  const empEmailIndex = headers.indexOf('Employee Email');
  const empSlideIndex = headers.indexOf('Employee Slide');
  const statusIndex = headers.indexOf('Status');

  // Iterate through each row to capture individual details
  for (let i = 1; i < values.length; i++) {
    const rowData = values[i];
    const empName = rowData[empNameIndex];
    const date = rowData[dateIndex];
    const managerName = rowData[managerNameIndex];
    const title = rowData[titleIndex];
    const compName = rowData[compNameIndex];

    // Make a copy of the Slide template and rename it with employee name
    const tempFolder = DriveApp.getFolderById(tempFolderId);
    const empSlideId = template.makeCopy(tempFolder).setName(empName).getId();
    const empSlide = SlidesApp.openById(empSlideId).getSlides()[0];

    // Replace placeholder values with actual employee related details
    empSlide.replaceAllText('Employee Name', empName);
    empSlide.replaceAllText('Date', 'Date: ' + Utilities.formatDate(date, Session.getScriptTimeZone(), 'MMMM dd, yyyy'));
    empSlide.replaceAllText('Your Name', managerName);
    empSlide.replaceAllText('Title', title);
    empSlide.replaceAllText('Company Name', compName);

    // Update the spreadsheet with the new Slide Id and status
    sheet.getRange(i + 1, empSlideIndex + 1).setValue(empSlideId);
    sheet.getRange(i + 1, statusIndex + 1).setValue('CREATED');
    SpreadsheetApp.flush();
  }
}

/**
 * Send an email to each individual employee
 * with a PDF attachment of their appreciation certificate
 */
function sendCertificates() {
  // Get all employee data from the spreadsheet and identify the headers
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const values = sheet.getDataRange().getValues();
  const headers = values[0];
  const empNameIndex = headers.indexOf('Employee Name');
  const dateIndex = headers.indexOf('Date');
  const managerNameIndex = headers.indexOf('Manager Name');
  const titleIndex = headers.indexOf('Title');
  const compNameIndex = headers.indexOf('Company Name');
  const empEmailIndex = headers.indexOf('Employee Email');
  const empSlideIndex = headers.indexOf('Employee Slide');
  const statusIndex = headers.indexOf('Status');

  // Iterate through each row to capture individual details
  for (let i = 1; i < values.length; i++) {
    const rowData = values[i];
    const empName = rowData[empNameIndex];
    const date = rowData[dateIndex];
    const managerName = rowData[managerNameIndex];
    const title = rowData[titleIndex];
    const compName = rowData[compNameIndex];
    const empSlideId = rowData[empSlideIndex];
    const empEmail = rowData[empEmailIndex];

    // Load the employee's personalized Google Slide file
    const attachment = DriveApp.getFileById(empSlideId);

    // Setup the required parameters and send them the email
    const senderName = 'CertBot';
    const subject = empName + ', you\'re awesome!';
    const body = 'Please find your employee appreciation certificate attached.' +
    '\n\n' + compName + ' team';
    GmailApp.sendEmail(empEmail, subject, body, {
      attachments: [attachment.getAs(MimeType.PDF)],
      name: senderName
    });

    // Update the spreadsheet with email status
    sheet.getRange(i + 1, statusIndex + 1).setValue('SENT');
    SpreadsheetApp.flush();
  }
}

Colaboradores

Este ejemplo fue creado por Sourabh Choraria, bloguero y experto en desarrolladores de Google.

Google mantiene esta muestra con la ayuda de expertos en desarrollo de Google.

Próximos pasos