傳送個人化感謝證明給員工

程式設計層級:入門
時間長度:15 分鐘
專案類型:透過自訂選單執行自動化動作

目標

  • 瞭解解決方案的功能。
  • 瞭解 Apps Script 服務在 解決方案
  • 設定環境。
  • 設定指令碼。
  • 執行指令碼。

認識這項解決方案

自動自訂 Google 簡報員工憑證範本 更新 Google 試算表中的員工資料,再使用 Gmail。

建立員工憑證

運作方式

這個指令碼使用的 Employee Certificate 簡報範本: 和員工一起使用簡報和試算表 詳細資料。指令碼會將範本 將預留位置替換成試算表資料。執行指令碼後 為每位員工製作投影片,將每張投影片擷取為 PDF 檔案。 並傳送證書給員工。

Apps Script 服務

這項解決方案使用下列服務:

必要條件

如要使用這個範例,您必須具備下列先決條件:

  • Google 帳戶 (Google Workspace 帳戶可能會 需要管理員核准)。
  • 可存取網際網路的網路瀏覽器。

設定環境

  1. 按一下下方按鈕即可建立「員工憑證」的副本 簡報範本。
    建立副本

  2. 記下簡報 ID,供後續步驟使用。你可以 您可以從網址中找出 ID:

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

  3. 在雲端硬碟中建立存放憑證的新資料夾。

  4. 請記下資料夾 ID,後續步驟將會用到。您可以在 網址中的 ID: https://drive.google.com/drive/folders/FOLDER_ID

設定指令碼

  1. 點選下方按鈕即可建立「Employee credentials」(員工憑證) 範例範例的副本 試算表。這項操作的 Apps Script 專案 解決方案附加在試算表上
    建立副本

  2. 在試算表中按一下滑鼠,開啟 Apps Script 專案 「擴充功能」>「Apps Script」

  3. 針對 slideTemplateId 變數,請將 將 PRESENTATION_ID 替換為您的簡報 ID。

  4. 針對 tempFolderId 變數,替換 FOLDER_ID 替換為資料夾 ID

  5. 按一下 [儲存 「儲存」圖示]。

執行指令碼

  1. 切換回試算表,然後按一下「感謝」 >>「Create credentials」(建立憑證)。您可能需要 重新整理頁面以顯示此自訂選單。
  2. 出現提示時,請授權指令碼。 如果 OAuth 同意畫面顯示「這個應用程式未經驗證」警告, 如要繼續,請選取「進階」圖示 > 前往 {Project Name} (不安全)

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

貢獻者

這個範例是由 Sourabh Choraria 和 Google Developers 共同製作 專家-

這個範例是由 Google 在 Google Developers 專家的協助下維護。

後續步驟