앱스 스크립트 사용법 (4) gmail에 접근하기

이번에는 구글 앱스 스크립트를 사용하여 gmail에 접근하여 gmail 검색 결과를 시트에 출력해주는 시트를 만들어 보겠습니다.

개요

이번 샘플 시트는 gmail을 접근하는 기능 보여드리기 위한 시트입니다.

  1. 검색 조건을 입력하고, 출력할 스프레드시트를 준비한다.
  2. 스프레드시트에 입력한 검색 조건으로 gmail을 검색한 결과를 같은 시트 아래쪽에 출력하는 앱스 스크립트를 작성한다.
  3. 앱스 스크립트로 스프레드시트에 커스텀 메뉴 추가한다.

저는 이 시트 그대로 사용하는 것은 아니지만, gmail 접근 기능을 활용하여 개인 업무용으로 사용하고 있습니다. 저희 팀은 매주 금요일에 그 주의 주간 보고서를 메일로 보내고 있습니다. 저는 커뮤니케이션 업무가 많아서 메일  = 업무 내용이기 때문에 그 주의 월요일~금요일 사이에 제가 남에게 보낸 메일 제목을 날짜 순 목록을 작성하는 시트를 만들어서 주간 보고서를 작성할 때 참고하고 있습니다.

★샘플 스프레드시트
https://docs.google.com/spreadsheets/d/1CkgFf5NQy6Fb2xyvL0SQEAS41O-litAdS-MJ74hG4pA/edit?usp=sharing

스프레드시트를 준비

‘gmail 검색’라는 이름의 스프레드시트를 작성합니다.
searchgmail01
첫번째행에는 이메일 검색 조건을 입력할 컬럼을,
세번째 행에는 출력될 이메일 리스트의 헤더를 작성합니다.

앱스 스크립트를 작성

도구 > 스크립트 편집기 메뉴를 클릭합니다.
searchgmail02

스크립트 편집 화면에 아래 코드를 넣고 저장합니다.

function myFunction(){

 var sheet = SpreadsheetApp.getActiveSheet();
 var datarange = sheet.getDataRange();
 var startRows = datarange.getNumRows();
 var numRows = startRows +1;

 // 메일 검색 조건
 var seach_condition = sheet.getRange(1, 2).getValues();
// 검색 조건 체크하기. 
 if(seach_condition == ""){
  Browser.msgBox('[ERROR] 검색 조건이 비어있습니다.');
  return;
 }

 // 검색하기
 var threads = GmailApp.search(seach_condition);

 // 검색 정보 쓰기
 numRows = numRows + 1;
 sheet.getRange(numRows, 1).setValue("검색조건: ");
 sheet.getRange(numRows, 2).setValue(seach_condition);
 sheet.getRange(numRows, 3).setValue("검색결과: " + threads.length);
 numRows = numRows + 1;

 // 검색 결과 쓰기
 if(threads.length != 0) {
  for(var i = 0; i< threads.length; i++){
   var trd = threads[i];
   var msg_list = trd.getMessages();
   for(var m = 0; m < msg_list.length; m++){
    var msg = msg_list[m];
     sheet.getRange(numRows, 1).setValue(formatDateYMDhm(msg.getDate())); // 날짜
     sheet.getRange(numRows, 2).setValue(msg.getSubject()); // 제목
     sheet.getRange(numRows, 3).setValue(msg.getFrom()); // from
     sheet.getRange(numRows, 4).setValue(msg.getTo()); // to
     numRows = numRows + 1;
   } // end for m
  } // end for i
 }

}

function formatDateYMDhm(date) {
 var formattedDate = Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm");
 return formattedDate;
}

프로젝트 이름은 search_gmail 이라고 저장합니다.

searchgmail03

실행 > 함수 실행 > myFuction 을 클릭합니다.

searchgmail04

처음 실행하실 때, 권한 요청을 해옵니다. 실행을 허용해주세요. (자세한 스샷은 생략합니다.)

그리고 권한 허용 후에도 처음 실행하시면 아무리 기다려도 아래 표시가 사라지지 않을 것입니다.

searchgmail05

시트로 돌아가보면 에러 메시지가 표시되어 있습니다.

searchgmail06

검색 조건이 없으면 경고창을 띄우고 함수 실행을 중지하는 코드가 들어가 있기 때문입니다.
확인 버튼을 클릭하여 경고창을 닫아주세요.

검색 조건을 넣기 전에 gmail로 가서 먼저 검색을 진행해봅니다.
searchgmail07

gmail의 검색 조건을 그대로 가져와 시트에 입력해줍니다.
searchgmail08
그리고 다시 스크립트를 실행합니다.searchgmail_run

시트에 검색 결과가 표시된 것을 확인합니다.
searchgmail09

아까 gmail에서 검색한 결과와 비교해보면 약간 검색결과가 많게 나왔습니다.
쓰레드로 묶인 관련 메일까지 함께 결과로 나오기 때문입니다.

커스텀 메뉴 추가

여기서부터는 편의성을 위해 커스텀 메뉴를 추가해보겠습니다.

스프레드시트에서 검색 조건 입력하고, 스크립트가서 실행해야하는 불편함이 있습니다.
스크립트 편집 화면에 아래 코드를 추가하고 저장합니다.

function onOpen() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var menuEntries = [];
 menuEntries.push({name: "gmail 검색", functionName: "myFunction"});
 ss.addMenu("CustomMenu", menuEntries);
}

searchgmail10

스프레드시트를 닫았다가 다시 열어봅니다.
searchgmail11

파일을 열고 조금 기다리면
메뉴 가장 오른쪽에 새로 추가한 CustomMenu > gmail 검색 메뉴가 추가됩니다.
이제는 스크립트로 가지 않아도 스프레드시트에서 함수를 실행할 수 있습니다.

searchgmail12

이번에도 실행하기 전에 gmail에 가서 먼저 검색을 진행해봅니다.

searchgmail13

시트로 돌아와 gmail의 검색 조건을 그대로 입력해줍니다.
그리고 CustomMenu > gmail 검색 을 클릭합니다.

searchgmail14

시트 아래쪽에 새로운 검색 결과가 출력되는 것을 확인 할 수 있습니다.

searchgmail15

6 Replies to “앱스 스크립트 사용법 (4) gmail에 접근하기”

    1. 쓰레드 첫번째 메일만 나오게 하면 될것같습니다.

      검색 결과를 쓰는 두 번째 for문을 돌리지 않고
      msg_list의 첫번째 메일만 출력하시면 될 것 같습니다.

      for(var m = 0; m < msg_list.length; m++){ <– 두 번째 for문

      좋아요

  1. 빠르게 회신 감사합니다,. 제가 코딩 잘몰라서요, 혹시 코딩내용도 같이 공유가능하실까요?
    업무에 활용하는데 정말 유용하게 쓰일 것 같습니다.

    좋아요

    1. 간단하게 코딩 남깁니다. 참고하시기 바랍니다.
      다만.. 테스트해본것은 아니라서 에러가 날 수도 있습니다..

      // 검색 결과 쓰기
      if(threads.length != 0) {
      for(var i = 0; i< threads.length; i++){
      var trd = threads[i];
      var msg_list = trd.getMessages();
      var msg = msg_list[0];
      sheet.getRange(numRows, 1).setValue(formatDateYMDhm(msg.getDate())); // 날짜
      sheet.getRange(numRows, 2).setValue(msg.getSubject()); // 제목
      sheet.getRange(numRows, 3).setValue(msg.getFrom()); // from
      sheet.getRange(numRows, 4).setValue(msg.getTo()); // to
      numRows = numRows + 1;
      } // end for i
      }

      좋아요

      1. 코딩 감사합니다 유용하게 사용할께요.
        threads에서 1개만 뽑을 수 있는데 last 메세지는 아니네요.
        고민해봐야 겠습니다.

        좋아요

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중