오빠두엑셀 `2026 무료 챌린지` 오픈! 완주하고 수료증 받아가세요! 5년 연속 IT분야 베스트셀러! 「 진짜쓰는 실무엑셀 」로 2026년 공부 끝내기 엑셀이 막히셨나요? Q&A 게시판에서 바로 해결하세요.
메뉴
Lecture Live 구글시트, 업무 자동화 특별 ...
Live Replay 멤버쉽 라이브 강의

구글시트, 업무 자동화 특별 스터디 (5강) | 구글 드라이브 & G메일 자동화 실습⚡

오빠두엑셀
오빠두엑셀 Microsoft MVP · Excel Expert
| 2022년12월03일

강의 소개

1. 실시간 인기 검색어 출력

1실시간 인기 검색어 배열_R

오늘 강의에서는 이전 시간에 만든 함수를 활용해 실시간 인기 검색어를 배열로 받아오는 방법을 알아봅니다.

.
2실시간 인기 검색어 출력_R

이후 검색 시간과 실시간 인기 검색어를 특정 시트에 누적해서 출력하는 방법을 알아봅니다.

2. Apps Script 트리거 활용, 매시간 자동 실행

3구글 트리거, 메일앱 사용시 제한사항_R

이후 Apps Script 에서 제공하는 다양한 무료 서비스 종류와 제한사항을 간략히 알아본 후,

.
4구글 시트 트리거 매시간 자동 실행_R

트리거를 활용해 매 5분마다 자동으로 실시간 인기검색어를 누적 조회하는 프로그램을 제작합니다.

3. 구글시트 ↔ G메일 연동 및 자동화

5구글시트 메일 보내기 자동화_R

이후 Apps Script에서 제공하는 MailApp을 활용해 구글시트와 G메일을 연동하고 메일을 보내는 방법을 알아봅니다.

.
6구글시트 메일 발송 첨부파일_R

마지막으로 구글 시트에 입력된 데이터를 참고하여 PDF 파일을 생성한 후 메일의 첨부파일로 보내는 방법을 알아봅니다.

보충 자료

📌 Apps Script 자동화 스터디 (5일차) - 예제 파일 및 코드

/* ------------------ 실시간 인기검색어 + 매 시간 자동 Trigger ------------------------ */

/**
 * 실시간 인기검색어 Top10 목록을 시트에 출력합니다.
 */
function printRealtimeSearch() {
 
  /* 
  구글스프레드시트 기본 변수 선언 
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getSheetByName('시트이름');
  */

  /* 현재 활성화된 시트 마지막 행 찾기 */
 
  /* 
  현재 시간을 지정한 날짜 서식으로 반환합니다. (2회차 강의 참고) 
	var displayTime = Utilities.formatDate(new Date, Session.getTimeZone(), "y-M-d H:m:s")
  */
 
  /* 실시간 인기 검색어 목록 받아온 후, 현재 시간과 함께 시트에 출력하기*/

}

/**
 * 시그널 홈페이지에서 실시간 인기검색어 Top 10 목록을 반환합니다.
 * 구글시트 자동화 특강 4일차 강의 참고
 * @customfunction
 */
function getRealtimeSearch() {
 
  var url = "https://api.signal.bz/news/realtime/"
  var response = UrlFetchApp.fetch(url);
  var webContent = response.getContentText();
  var jsonData = JSON.parse(webContent); //JSON일 경우 데이터 변환

  var top10 = jsonData.top10;
  var result = [];

  for (var i = 0; i <= top10.length - 1; i++) {
    result.push([top10[i].keyword]);
  }

  return result;
}

/**
 * 특정 열의 마지막 데이터가 입력된 행 번호를 반환합니다.
 */
function getEndRow(colNo) {

  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getActiveSheet();
 
  var maxRow = activeSheet.getMaxRows();
  var maxRange = activeSheet.getRange(maxRow,colNo);
  var lastRange = maxRange.getNextDataCell(SpreadsheetApp.Direction.UP);
  var endRow = lastRange.getRow();

  return endRow;

}

/* ------------------ 이메일 보내기 자동화 실습 ------------------------ */
function sendEmail() {

  /**
   * G메일 MailApp에 대한 자세한 설명은 아래 링크를 참고하세요.
   * https://developers.google.com/apps-script/reference/mail/mail-app
   * 주요 확인사항
   * 1. 일일 발송량 : 100개 (무료) / 1,500개 (WorkSpace)
   * 2. 이메일 본문크기 : 200kb (무료) / 400kb (WorkSpace)
   * */ 

  /*
  메일을 보내기 위한 수신자 목록 확인 
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getSheetByName('시트이름');
  var endRow = getEndRow(1);
  */

  /* 
  ■ 이메일 발송
  옵션 1: 배열로 설정하여 보내는 방법 (다양한 설정 가능하지만 최초 입력시 번거로움)
  MailApp.sendEmail({to: "수신인", bcc: "숨은참조", body: "본문", subject: "제목" 등..})
  
  옵션 2 : 수신인, 제목, 본문 + 옵션으로 보내는 방법 (1번보다 쉽게 설정 가능, 필요시 추가 옵션 지정)
  MailApp.sendEmail(수신인,제목,본문,[옵션])
  */

  /*
  1. for문으로 각 이메일을 하나씩 돌아가며, 이메일주소/이름/등급 받아오기
  2. 받아온 값으로 메일에 들어갈 본문만들기
  3. MailApp 으로 이메일 발송하기
  4. PDF blob 데이터 생성 후, 첨부파일 추가하기
  5. 잔여 이메일 발송량 확인하기 (하루 100개 제한)
  */

}

/**
 * PDF 형식의 blob 데이터를 생성합니다.
 */
function convertToBlob(contents,filename) {
  var blob = Utilities.newBlob(contents,MimeType.HTML,filename);
  var pdf = blob.getAs(MimeType.PDF);
  return pdf;
}

✅ Apps Script 자동화 스터디 (5일차) - 강의 완성 코드

/* ------------------ 실시간 인기검색어 + 매 시간 자동 Trigger ------------------------ */
 
/**
 * 실시간 인기검색어 Top10 목록을 시트에 출력합니다.
 */
function printRealtimeSearch() {
 
  /* 
  구글스프레드시트 기본 변수 선언 
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getSheetByName('시트이름');
  */

  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getSheetByName('실시간인기검색어');
  
  /* 현재 활성화된 시트 마지막 행 찾기 */
  var endRow = getEndRow(1);
  // var endRow = activeSheet.getLastRow();

  /* 
  현재 시간을 지정한 날짜 서식으로 반환합니다. (2회차 강의 참고) 
	var displayTime = Utilities.formatDate(new Date, Session.getTimeZone(), "y-M-d H:m:s")
  */
  var displayTime = Utilities.formatDate(new Date, Session.getTimeZone(), "y-M-d H:m:s");

  /* 실시간 인기 검색어 목록 받아온 후, 현재 시간과 함께 시트에 출력하기*/
  var keywords = getRealtimeSearch();
  var count = keywords.length;
  var sequence = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]];
  activeSheet.getRange(endRow+1,2,count).setValues(keywords);
  activeSheet.getRange(endRow+1,1,count).setValue(displayTime);
  activeSheet.getRange(endRow+1,3,count).setValues(sequence);
}
 
/**
 * 시그널 홈페이지에서 실시간 인기검색어 Top 10 목록을 반환합니다.
 * 구글시트 자동화 특강 4일차 강의 참고
 * @customfunction
 */
function getRealtimeSearch() {
 
  var url = "https://api.signal.bz/news/realtime/"
  var response = UrlFetchApp.fetch(url);
  var webContent = response.getContentText();
  var jsonData = JSON.parse(webContent); //JSON일 경우 데이터 변환
 
  var top10 = jsonData.top10;
  var result = [];
 
  for (var i = 0; i <= top10.length - 1; i++) {
    result.push([top10[i].keyword]);
  }
 
  return result;
}
 
/**
 * 특정 열의 마지막 데이터가 입력된 행 번호를 반환합니다.
 */
function getEndRow(colNo) {
 
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getActiveSheet();
 
  var maxRow = activeSheet.getMaxRows();
  var maxRange = activeSheet.getRange(maxRow,colNo);
  var lastRange = maxRange.getNextDataCell(SpreadsheetApp.Direction.UP);
  var endRow = lastRange.getRow();
 
  return endRow;
 
}
 
/* ------------------ 이메일 보내기 자동화 실습 ------------------------ */
function sendEmail() {
 
  /**
   * G메일 MailApp에 대한 자세한 설명은 아래 링크를 참고하세요.
   * https://developers.google.com/apps-script/reference/mail/mail-app
   * 주요 확인사항
   * 1. 일일 발송량 :  100개 (무료) / 1,500개 (WorkSpace)
   * 2. 이메일 본문크기 : 200kb (무료) / 400kb (WorkSpace)
   * */ 
 
  /*
  메일을 보내기 위한 수신자 목록 확인 
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getSheetByName('시트이름');
  var endRow = getEndRow(1);
  */
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getSheetByName('이메일발송');
  var endRow = getEndRow(1);

  /* 
  ■ 이메일 발송
  옵션 1: 배열로 설정하여 보내는 방법 (다양한 설정 가능하지만 최초 입력시 번거로움)
  MailApp.sendEmail({to: "수신인", bcc: "숨은참조", body: "본문", subject: "제목" 등..})
 
  옵션 2 : 수신인, 제목, 본문 + 옵션으로 보내는 방법 (1번보다 쉽게 설정 가능, 필요시 추가 옵션 지정)
  MailApp.sendEmail(수신인,제목,본문,[옵션])
  */
 
  /*
  1. for문으로 각 이메일을 하나씩 돌아가며, 이메일주소/이름/등급 받아오기
  2. 받아온 값으로 메일에 들어갈 본문만들기
  3. MailApp 으로 이메일 발송하기
  4. PDF blob 데이터 생성 후, 첨부파일 추가하기
  5. 잔여 이메일 발송량 확인하기 (하루 100개 제한)
  */

  for (i=2;i<=endRow;i++) {
    var currentEmail = activeSheet.getRange(i,1).getValue();
    var currentName = activeSheet.getRange(i,2).getValue();
    var currentGrade = activeSheet.getRange(i,3).getValue();
    var currentContents = '오빠두엑셀 성적표'+currentName+'님의 성적은 ['+currentGrade+'] 입니다.오빠두엑셀 (인)';
    //Logger.log('이메일주소:'+currentEmail+' 이름:'+currentName+' 성적:'+currentGrade)

    var attachment = convertToBlob(currentContents,'성적표');

    /* 성적표 보내기 예제 */
    MailApp.sendEmail(currentEmail,
                      currentName+'님의 성적표',
                      '안녕하세요. 오빠두엑셀입니다.\n\n'
                      +currentName+' 님의 성적은 ['+currentGrade+'] 등급입니다.\n\n'
                      +'감사합니다. 오빠두엑셀 드림',
                      {attachments: [attachment]});
    
    /*
    실시간 인기 검색어 보내기 예제
    MailApp.sendEmail(currentEmail,
                      '현재시간 인기검색어',
                      getRealtimeSearch().join());
    */
    
  }

  app.getUi().alert('발송완료!\n 잔여 발송량'+MailApp.getRemainingDailyQuota()+'개 입니다.');

}
 
/**
 * PDF 형식의 blob 데이터를 생성합니다.
 */
function convertToBlob(contents,filename) {
  var blob = Utilities.newBlob(contents,MimeType.HTML,filename);
  var pdf = blob.getAs(MimeType.PDF);
  return pdf;
}
댓글 3
5 (3개 평가)
삐가삐까츅
삐가삐까츅 2022.12.05 16:58
유익한 강의 감사합니다 ㅎ 트리거가 무료로 제공되는게 정말 놀랍네요ㅎ 잘 사용하겠습니다
포포대박
포포대박 2023.03.27 21:45
필요했던 내용인데... 너무너무 감사합니다.
강민준🤗
강민준🤗 2024.08.12 09:58
좋은 강의 정말 감사합니다🙇‍♂️