[결정판] GAS에서 Gmail 검색 결과를 스프레드 시트로 추출하는 방법

소개



Gmail 검색 결과를 스프레드시트에 맞추는 방법을 알아봅니다. Google Apps Script(GAS)를 사용합니다.

소개 간이 버전의 코드를 제시하고, 그 후에 특정한 경우에 있던 추가 구현에 대해 설명합니다.

구현



구현은 이하로 30 행 정도로 구현할 수 있다. 꽤 처리를 좁힌 컴팩트 버전이므로, 템플릿적으로 사용해 주시면!
// 設定情報
function getConfig() {
  return {
    spreadSheetId: '',// スプレッドシートの ID
    spreadSheetTabName: '',// スプレッドシートのタブ名
    searchText: ''// Gmail の検索ワード
  };
}

// 実行関数
function main() {
  var config   = getConfig();
  var sheet    = SpreadsheetApp.openById(config.spreadSheetId)
                               .getSheetByName(config.spreadSheetTabName);
  var messages = [['Subject', 'From', 'To']];

  GmailApp
    .search(config.searchText, 0, 500)
    .forEach(function (thread) {
      thread.getMessages().forEach(function (message) {
        var subject = message.getSubject();
        var to      = message.getTo();
        var from    = message.getFrom();
        messages.push([subject, from, to]);
      });
    });

  if (messages.length === 0) return;
  sheet.getRange('A1:C' + messages.length ).setValues(messages);
}

사용법



기본적으로 위의 코드를 GAS 편집기 ( htps : // sc pt. 오, ぇ. 이 m )에 붙여 넣고 getConfig 함수의 각 키에 값을 입력하면 작동합니다. 최대 500 건을 한 번에 가져오는 사양이므로 사용법에 따라 추가 개발이 필요.

제목, 발신지, 목적지 이외의 정보 취득



위의 코드는 제목, 발신자 및 목적지 만 취할 수 있습니다. 본문이나, 일자, 첨부 파일등 가지고 싶으면 추가 취득 가능.


클래스 GmailMessage 의 Get 계 메서드 일람

복잡한 검색을 원합니다.



시간을 지정하는 등, 동적으로 검색 조건을 바꾸고 싶은 경우나 복잡한 검색 조건으로 검색하고 싶은 경우 등은, getConfig 로부터 외출해, 검색 워드를 정형할 필요가 있다.

검색 워드를 조립하는 방법에 대해서는 공식 도움말의 Gmail에서 사용할 수 있는 검색 연산자 를 참고하면 된다.

위 도움말에서는 특별히 언급하지 않았지만 after/before 등은 UNIX Time에서 지정도 가능합니다. 다음 코드로 1시간 전부터의 메일을 추출할 수 있다.
var after = parseInt(((new Date()).getTime() - 1 * 60 * 60 * 1000) / 1000);
var searchText = 'subject:github after:' + after;

대량의 메일을 한꺼번에 추출하고 싶습니다.



G 마이 p. 세아rch 메서드는 많은 양의 메일을 치면 오류가 발생합니다. 제 2 인수로 skip 의 지정이 가능하기 때문에, for문등으로 돌려, 500 건씩 정도로 메일을 취득해, 대량 취득이 가능하게 된다.
for (var i = 0; i < 100; i++) {
  var threads = GmailApp.search(searchText, i*max+1, 500);
  // 省略
  if (threads.length === 0) break;
}

정기적으로 메일을 추출하여 시트에 모으고 싶습니다.



정기적으로 추출하고 싶은 경우는 시간 주도형 트리거 를 사용해 정기 실행시킨다. 정확한 추출이 요구되는 경우에는, 더브리나 누설이 일어나지 않게, after (↑복잡한 검색을 하고 싶은 부분에서 소개)에 여유를 갖게 해 실행 간격보다 긴 기간으로 검색해, 메일의 신분증을 확인하는 것이 좋습니다.

GmailMessage.getId() 로 고유의 ID 를 취득할 수 있으므로, ID 도 시트에 기록하도록(듯이) 하고, Array.push 전에 중복하지 않는지 체크하는 것이 좋다.

숫자를 집계하고 싶습니다.



숫자를 집계하는 경우 Google Apps Script에서 할 수 있지만 스프레드시트 함수을 사용하는 것이 좋습니다. 가능한 한 GAS의 코드는 최소화되어 Google Apps (스프레드 시트, Gmail 등)의 기능을 활용하는 것이 나중에 유지 보수가 쉬워집니다.

특히 SQL 라이크에 쓸 수 있다 QUERY 함수 (은)는 꽤 사용할 수 있다.

다음 예제에서는 다른 시트(시트 이름: data)의 A 열에 특정 문자열(github)이 포함된 수를 반환합니다.
=QUERY(data!A:C, "select count(A) where A contains 'github'")

요약



이상, 간이한 코드로부터 각각의 케이스에 있던 실장 지침을 소개했습니다. 다른 GAS 재료도 쓰고 있으므로, 이하 참고해 주십시오.

관련 기사


  • GAS 초보자가 GAS를 다루기 위해 알아야 할 사항 10가지
  • 3분만에 무료 번역 API with Google Apps Script
  • Google Apps Script(GAS)에서 매주 30분의 작업을 자동화한 이야기
  • 좋은 웹페이지 즐겨찾기