이번에는 구글 앱스 스크립트를 사용하여 gmail에 접근하여 gmail 검색 결과를 시트에 출력해주는 시트를 만들어 보겠습니다.
개요
이번 샘플 시트는 gmail을 접근하는 기능 보여드리기 위한 시트입니다.
- 검색 조건을 입력하고, 출력할 스프레드시트를 준비한다.
- 스프레드시트에 입력한 검색 조건으로 gmail을 검색한 결과를 같은 시트 아래쪽에 출력하는 앱스 스크립트를 작성한다.
- 앱스 스크립트로 스프레드시트에 커스텀 메뉴 추가한다.
저는 이 시트 그대로 사용하는 것은 아니지만, gmail 접근 기능을 활용하여 개인 업무용으로 사용하고 있습니다. 저희 팀은 매주 금요일에 그 주의 주간 보고서를 메일로 보내고 있습니다. 저는 커뮤니케이션 업무가 많아서 메일 = 업무 내용이기 때문에 그 주의 월요일~금요일 사이에 제가 남에게 보낸 메일 제목을 날짜 순 목록을 작성하는 시트를 만들어서 주간 보고서를 작성할 때 참고하고 있습니다.
★샘플 스프레드시트
https://docs.google.com/spreadsheets/d/1CkgFf5NQy6Fb2xyvL0SQEAS41O-litAdS-MJ74hG4pA/edit?usp=sharing
스프레드시트를 준비
‘gmail 검색’라는 이름의 스프레드시트를 작성합니다.
첫번째행에는 이메일 검색 조건을 입력할 컬럼을,
세번째 행에는 출력될 이메일 리스트의 헤더를 작성합니다.
앱스 스크립트를 작성
도구 > 스크립트 편집기 메뉴를 클릭합니다.
스크립트 편집 화면에 아래 코드를 넣고 저장합니다.
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 이라고 저장합니다.
실행 > 함수 실행 > myFuction 을 클릭합니다.
처음 실행하실 때, 권한 요청을 해옵니다. 실행을 허용해주세요. (자세한 스샷은 생략합니다.)
그리고 권한 허용 후에도 처음 실행하시면 아무리 기다려도 아래 표시가 사라지지 않을 것입니다.
시트로 돌아가보면 에러 메시지가 표시되어 있습니다.
검색 조건이 없으면 경고창을 띄우고 함수 실행을 중지하는 코드가 들어가 있기 때문입니다.
확인 버튼을 클릭하여 경고창을 닫아주세요.
검색 조건을 넣기 전에 gmail로 가서 먼저 검색을 진행해봅니다.
gmail의 검색 조건을 그대로 가져와 시트에 입력해줍니다.
그리고 다시 스크립트를 실행합니다.
시트에 검색 결과가 표시된 것을 확인합니다.
아까 gmail에서 검색한 결과와 비교해보면 약간 검색결과가 많게 나왔습니다.
쓰레드로 묶인 관련 메일까지 함께 결과로 나오기 때문입니다.
커스텀 메뉴 추가
여기서부터는 편의성을 위해 커스텀 메뉴를 추가해보겠습니다.
스프레드시트에서 검색 조건 입력하고, 스크립트가서 실행해야하는 불편함이 있습니다.
스크립트 편집 화면에 아래 코드를 추가하고 저장합니다.
function onOpen() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var menuEntries = []; menuEntries.push({name: "gmail 검색", functionName: "myFunction"}); ss.addMenu("CustomMenu", menuEntries); }
스프레드시트를 닫았다가 다시 열어봅니다.
파일을 열고 조금 기다리면
메뉴 가장 오른쪽에 새로 추가한 CustomMenu > gmail 검색 메뉴가 추가됩니다.
이제는 스크립트로 가지 않아도 스프레드시트에서 함수를 실행할 수 있습니다.
이번에도 실행하기 전에 gmail에 가서 먼저 검색을 진행해봅니다.
시트로 돌아와 gmail의 검색 조건을 그대로 입력해줍니다.
그리고 CustomMenu > gmail 검색 을 클릭합니다.
시트 아래쪽에 새로운 검색 결과가 출력되는 것을 확인 할 수 있습니다.
이것 찾고 있었는데.. 감사합니다!!!!
좋아요좋아요
감사합니다. 저도 찾고 있었는데요.
설명주신 것 중에서 쓰레드로 묶인 관련 메일을 안나오고 할 수 있나요?
좋아요좋아요
쓰레드 첫번째 메일만 나오게 하면 될것같습니다.
검색 결과를 쓰는 두 번째 for문을 돌리지 않고
msg_list의 첫번째 메일만 출력하시면 될 것 같습니다.
for(var m = 0; m < msg_list.length; m++){ <– 두 번째 for문
좋아요좋아요
빠르게 회신 감사합니다,. 제가 코딩 잘몰라서요, 혹시 코딩내용도 같이 공유가능하실까요?
업무에 활용하는데 정말 유용하게 쓰일 것 같습니다.
좋아요좋아요
간단하게 코딩 남깁니다. 참고하시기 바랍니다.
다만.. 테스트해본것은 아니라서 에러가 날 수도 있습니다..
// 검색 결과 쓰기
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
}
좋아요좋아요
코딩 감사합니다 유용하게 사용할께요.
threads에서 1개만 뽑을 수 있는데 last 메세지는 아니네요.
고민해봐야 겠습니다.
좋아요좋아요
안녕하세요 좋은 팁 감사합니다. 혹시 본문 내용까지 추출이 가능하도록 코딩 가능할까요?
좋아요좋아요
메일의 본문은 getPlainBody() 메소드를 사용하시면 됩니다.
https://developers.google.com/apps-script/reference/gmail/gmail-message#getplainbody
예시)
sheet.getRange(numRows, 5).setValue(msg.getPlainBody()); // 내용
좋아요좋아요
안녕하세요 앱스크립트로 자동 진행이가능한지 여쭙고 싶어서 오랜만에 댓글 남깁니다.
구글 시트 내 규칙대로 앱스크립트를 통해 해당 산출물이 나올 수 있을까요?
[규칙]
1. 사람이 작성한 시트를 운영자가 작성하면, 다른 시트에 업로드할 시트로 형식이 바뀌어서 나오면 됩니다.
2. A 열이나 B 열의 값이 달라지면, end 를 찍고 다음 그룹을 시작해야합니다.
3. 한 그룹에 포함된 행의 숫자는 그룹마다 다를 수 있습니다.
4. 한 그룹이 끝날 때는 end 라고 약속된 값이 들어간 행이 포함되어야 합니다.
■ 구글 시트
https://docs.google.com/spreadsheets/d/16-eSaGYYGCnLKoqTMQvL9BOlTH677MhoZissx2CMJlg/edit#gid=1809596664
좋아요좋아요
안녕하세요 감사합니다.
메일 내용도 불러올 수 있을까요?
메일로 유입되는 리드(메일 내용)를 시트에 자동으로 리스팅할 수 있을까요?
좋아요좋아요