클릭 한번으로 사내 증명서 발급하기 (1)

소개

직원수가 많은 회사에서 아르바이트 하다보니 각종 증명서를 발급하는 담당직원이 매번 각종 정보를 복사하거나 타이핑 하는걸 보면서 조금 편하게 해줄까 하는 생각이 들었습니다. 한번 만들어😁 🥰 두면 다양하게 활용이 가능하겠더군요.

(글쓰는 재주가 없어 정보 위주로 정리할게요)

진행 방법

사용도구: chatGPT와 구글 시트, 독스, 앱스 스크립트를 사용

  1. gpt에게 구글시트와 독스 문서ID를 포함해주고 스크립트를 요청

앱스 스크립트를 이용하여 아래 작성된 구글 독스와 시트에서 데이터를 입력받아 pdf를 구글 드라이브에 저장하는 자동화를 만들거야

아래 내용을 반영하여 앱스 스크립트를 작성하는 방법을 단계별로 상세하게 설명해줘 
 
구글 독스 1v-YXJ0R----------------KrH61xKs
구글 시트 1QFNF-------------------oELQnQ

구글 시트의 a열에서 체크박스에 체크가 입력되면 시트 행에 해당하는 내용을 구글 독스에 반영하여 pdf로 저장되도록 트리거 설정해줘  

구글 독스에는 이름, 생년월일은 표에 입력하고 
소속란에는 사업부와 부서를 입력
직급, 입사일자, 제출처를 그대로 입력하고 
증명서 하단 날짜는 파일 작성날짜를 입력해줘. 

작성시 준비한 시트와 문서는 아래 그림과 같습니다.

한국어 문자가 적힌 스프레드시트

한국어 비자 신청서 한국어 비자 신청서 한국어 비자 신청서 한국어 비자 신청서 한국어

스크립트에 있는 구글 시트와 독스 id를 확인하는 방법은 아래와 같습니다.

  1. 수정단계

gpt 답변을 단계별로 진행하면서 다양한 오류를 경험하고 수정하면서 하나씩 고쳐나갔습니다.

😢 그러나... 계속 되는 에러를 고민하다 알게된 것이 아웃풋인 pdf 파일을 저장할 공간을 지정해주지 않았더군요(혼자 바보라고 외쳤습니다 😮). 구글 드라이브 폴더 정보를 지정해 주어야 해당 폴더에 파일이 저장되더군요. 아래는 폴더 아이디를 확인하는 방법입니다.

한국사이트 스크린샷

폴더 아이디까지 추가한 후에야 파일이 생성되기 시작하더군요^^;;; 한 시간 넘게 걸쳐 수정을 반복하고, 트리거 조정하고 하면서 조금씩 완성이 되어갔습니다.

아래는 트리거 설정방법입니다

한국어로 된 Google 검색 페이지의 스크린샷

  1. 완료단계

약 두시간에 걸친 작업 끝에 완성된 pdf 파일입니다.

홍길동 (1).pdf
51.18KB

마지막으로 완성된 앱스 스크립트 코드 첨부합니다.

const SHEET_ID = '-----------'; // 구글시트 iD
const DOC_TEMPLATE_ID = '--------'; //구글독스 양식 ID
const FOLDER_ID = '--------'; // PDF 저장 폴더 ID 주소중 project/.../edit ...부분


function onEdit(e) {
  if (!e) {
    Logger.log('onEdit 함수는 직접 실행되지 않습니다.');
    return;
  }

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const range = e.range;

  Logger.log(`수정된 셀: ${range.getA1Notation()}`);
  Logger.log(`수정된 값: ${range.getValue()}`);

  if (range.getColumn() === 1 && range.getValue() === true) {
    Logger.log('체크박스가 선택되었습니다.');
    const row = range.getRow();
    const rowData = sheet.getRange(row, 2, 1, 7).getValues()[0];
    Logger.log('해당 행 데이터: ' + rowData.join(', '));

    const [name, dob, businessUnit, department, position, joinDate, submitto] = rowData;

    try {
      const doc = createDocument(name, dob, businessUnit, department, position, joinDate, submitto);
      const pdf = convertToPDF(doc, name);
      Logger.log(`PDF 파일 생성 완료: ${pdf.getName()}`);
    } catch (error) {
      Logger.log(`오류 발생: ${error.message}`);
    }
  }
}

function createDocument(name, dob, businessUnit, department, position, joinDate, submitto) {
  Logger.log('문서 생성 중...');
  const template = DriveApp.getFileById(DOC_TEMPLATE_ID);
  const newDoc = template.makeCopy(`증명서_${name}`, DriveApp.getFolderById(FOLDER_ID)).getId();
  Logger.log(`복사된 문서 ID: ${newDoc}`);
  const doc = DocumentApp.openById(newDoc);
  const body = doc.getBody();

  body.replaceText('{{이름}}', name);
  body.replaceText('{{생년월일}}', dob);
  body.replaceText('{{소속}}', `${businessUnit} / ${department}`);
  body.replaceText('{{직급}}', position);
  body.replaceText('{{입사일자}}', formatDate(new Date(joinDate)));
  body.replaceText('{{제출처}}', submitto);
  body.replaceText('{{작성일자}}', formatDate(new Date()));

  doc.saveAndClose();
  return doc;
}

function convertToPDF(doc, name) {
  Logger.log('PDF 변환 중...');
  const docFile = DriveApp.getFileById(doc.getId());
  const pdfBlob = docFile.getAs('application/pdf');
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const pdfFile = folder.createFile(pdfBlob.setName(`${name}.pdf`));
  docFile.setTrashed(true);
  return pdfFile;
}

function formatDate(date) {
  if (Object.prototype.toString.call(date) === '[object Date]') {
    return Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy-MM-dd');
  }
  return date;
}

결과와 배운 점

이전에 클로드를 이용할 때와 비교하면, gpt가 코딩에서는 설명과 에러수정에서 조금 부족한 느낌입니다. 여유되시면 스크립트는 클로드 추천합니다 😄

다음주는 증명서 신청을 받는 구글폼을 추가하고 이후에는 발행되는 증명서를 이메일로 발송하는 부분까지 추가해 보려합니다.

7
1개의 답글

👉 이 게시글도 읽어보세요