Отправьте сотрудникам персональные поздравительные грамоты

Уровень владения программированием : начинающий
Продолжительность : 15 минут
Тип проекта : Автоматизация с настраиваемым меню

Цели

  • Поймите, для чего предназначено это решение.
  • Разберитесь, что делают службы Apps Script в рамках данного решения.
  • Настройте свою среду.
  • Настройте скрипт.
  • Запустите скрипт.

Об этом решении

Автоматически настройте шаблон сертификата сотрудника в Google Slides, добавив данные сотрудника из Google Sheets, а затем отправьте сертификаты через Gmail.

Создание сертификата сотрудника

Как это работает

В скрипте используется шаблон презентации «Сертификат сотрудника» из Slides и электронная таблица Sheets с данными о сотрудниках. Скрипт копирует шаблон и заменяет заполнители данными из электронной таблицы. После создания слайда для каждого сотрудника скрипт извлекает каждый слайд в виде PDF-вложения и отправляет сертификаты сотрудникам.

Сервисы Apps Script

Данное решение использует следующие сервисы:

  • Сервис Drive – Копирование шаблона сертификата сотрудника Slides.
  • Сервис электронных таблиц – предоставляет подробную информацию о сотрудниках и обновляет статус каждого указанного сотрудника.
  • Услуга создания презентаций – заменяет заполнители в презентации данными о сотрудниках из электронной таблицы.
  • Сервис Gmail — получает отдельные слайды в формате PDF и отправляет их сотрудникам.

Предварительные требования

Для использования этого примера необходимы следующие условия:

  • Для работы потребуется учетная запись Google (для учетных записей Google Workspace может потребоваться подтверждение администратора).
  • Веб-браузер с доступом в интернет.

Настройте свою среду

  1. Нажмите на следующую кнопку, чтобы создать копию шаблона презентации «Сертификаты сотрудников» .
    Сделать копию

  2. Запишите идентификатор вашей презентации, он пригодится вам на следующем этапе. Идентификатор можно найти в URL-адресе:

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

  3. В Google Диске создайте новую папку для хранения сертификатов.

  4. Запишите идентификатор вашей папки, он пригодится вам на следующем шаге. Идентификатор можно найти в URL-адресе: https://drive.google.com/drive/folders/ FOLDER_ID

Настройте скрипт

  1. Нажмите кнопку ниже, чтобы создать копию образца электронной таблицы « Сертификаты сотрудников» . Проект Apps Script для этого решения прикреплен к электронной таблице.
    Сделать копию

  2. В электронной таблице откройте проект Apps Script, щелкнув Расширения > Apps Script .

  3. В переменной slideTemplateId замените PRESENTATION_ID . PRESENTATION_ID с идентификатором вашей презентации.

  4. В переменной tempFolderId замените FOLDER_ID . FOLDER_ID с идентификатором вашей папки.

  5. Нажмите «Сохранить». значок сохранения .

Запустите скрипт

  1. Вернитесь к электронной таблице и нажмите «Благодарности» > «Создать сертификаты» . Возможно, потребуется обновить страницу, чтобы появилось это пользовательское меню.
  2. При появлении запроса авторизуйте скрипт. Если на экране согласия OAuth отобразится предупреждение « Это приложение не проверено» , продолжите, выбрав «Дополнительно» > «Перейти к {Название проекта} (небезопасно)» .

  3. Нажмите «Благодарность» > «Создать сертификаты заново».

  4. После того, как в столбце «Статус» всех строк отобразится значение «Создано» , нажмите «Благодарность» > «Отправить сертификаты» .

Просмотрите код

Чтобы просмотреть код Apps Script для этого решения, нажмите «Просмотреть исходный код» ниже:

Просмотреть исходный код

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();
  }
}

Авторы

Этот пример создан Сурабхом Чорарией, блогером и экспертом Google для разработчиков.

  • Найти Сурабха можно в Твиттере по адресу @schoraria911 .
  • Читайте блог Сурабха.

Данный пример поддерживается компанией Google при содействии экспертов-разработчиков Google.

Следующие шаги