Gmail 첨부 파일을 자동으로 Google 드라이브에 저장을 GAS (Google Apps Script)로 구현

첫 투고입니다.

하고 싶은 일



Gmail에서 조건 검색한 이메일 첨부 파일을 Google 드라이브에 자동으로 저장



타 담당자가, 거래처로부터의 청구서를 매번 인쇄→경리 소프트웨어로 입력하고 있었습니다만, 인쇄를 생략하고 PDF 파일을 표시하면서 입력하는 환경을 목표로 하기 위해, Gmail의 메일을 첨부 파일(청구 책은 PDF이지만 이번에는 첨부 파일이라도 저장)을 Google Drive에 저장하는 스크립트를 구현했습니다.
신규성이 부족한 없는 내용입니다만, 첫 투고라고 하는 것과, 다소 집착한 점을 포함해 기재해 둡니다.

구현 흐름


  • 코딩 : Gmail 조건 검색 (이번에는 from, 날짜, 첨부 있음 조건)하여 검색 결과를 얻습니다
  • 코딩 : 검색 결과에서 첨부를 Google 드라이브에 순차적으로 저장
  • 실행 트리거 설정 : 시간을 트리거로 하루에 한 번 실행

  • 코드 아래를 참조했습니다. 거의 둥근 복사.
    텔레비전 방송국에서 일하는 독학 프로그래머 Gmail 첨부 파일을 google drive에 저장

    1. Gmail을 조건으로 검색(이번은 from, 날짜, 첨부 있음을 조건)하여 검색 결과를 취득



    SaveGmailAttachToDrive.gs
      //メール検索用の日付計算
      var now = new Date();
      var today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); //こうすることで0時0分0秒となる
      var yesterday = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1);  
      var strYesterday = Utilities.formatDate(yesterday, "JST", "yyyy/MM/dd");
    
      //メール検索キーワードの作成
      var condition = '';
    //  condition  += ' is:unread'  //未読
    //  condition += ' subject:添付やで';  //件名
      condition += ' has:attachment';  //添付あり
      condition += ' after:' + strYesterday;  //今日(昨日より後)
      condition += ' from:' + 'メールアドレス'; //差出人
    
      //Gmailで検索
      var searchMail = GmailApp.search(condition);
      var messeges = GmailApp.getMessagesForThreads(searchMail); //検索結果を配列で取得
    

    2. Gmail을 조건으로 검색 (이번에는 from, 날짜, 첨부 있음을 조건)하여 검색 결과를 취득



    메일의 검색 결과의 배열은 2차원이기 때문에, 이중 루프로 꺼냅니다

    SaveGmailAttachToDrive.gs
      var hozon_folder = DriveApp.getFolderById('GoogleDriveのFolderID');
      for(var i = 0; i < messeges.length; i++) { //検索結果を一つずつ取り出す
        for(var j = 0; j < messeges[i].length; j++) { //スレッドの場合ここを複数回実行
          var attach = messeges[i][j].getAttachments();
          var day = messeges[i][j].getDate(); //取り出したメールの日付を取得
          var strDay = Utilities.formatDate(day , "JST", "yyyy_MM_dd");
          if (day > today){ //★★メールが今日以降か再度チェック
            for(var k = 0; k < attach.length; k++){
              var filename = strDay + '_' + attach[k].getName();
              hozon_folder.createFile(attach[k]);
              var file = hozon_folder.getFilesByName(attach[k].getName())
              file.next().setName(filename);
            }
          }
        }
        messeges[i][0].markRead();
      }
    

    빠진 포인트



    메일 검색 결과는 메일 단위가 아니라 스레드 단위였습니다.
    즉, 1.의 처리로 오늘의 메일만 취득하고 있다고 생각했는데, 이하 이미지와 같이, Gmail의 검색 결과로 숫자가 표시되는 경우는, thread내에 복수의 메일이 포함되어 있어, 오늘보다 이전의 메일도 포함되어 있을 가능성이 높다.


    그렇다고 해서, thread로부터 메세지를 꺼낸 후에도 일자를 판정하는 처리를 더하고 있습니다.

    3. 실행 트리거 설정: 시간을 트리거로 하루에 한 번 실행



    실행일 첨부 파일을 체크하므로, 23~24시에 매일 실행으로 세트했습니다.
    트리거 설정은 아래를 참조하십시오.
    GAS 초보자가 GAS를 다루기 위해 알아야 할 사항 10가지



    Google Drive에 저장한 파일은 Google Drive↔Synology NAS Cloud Sync↔DropBox에서 DropbBox 동기화하여 다른 사용자도 볼 수 있습니다.
    Gmail→DropBox 직접 보존도 생각했습니다만, 이하 소거법에 의해 이번의 구현을 했습니다.
  • IFTTT : Gmail을 트리거로 연결이 종료되었습니다.
  • zaiper : 유료 범위가 있기 때문에 번거롭고 손을 내고 싶지 않습니다
  • MS Flow : 구현 가능하지만 서비스 계속 불안
  • DropBox API의 이용 : DropBox로 토큰을 취득할 때, DropBox내의 기존의 폴더를 대상으로 한 API를 이용하는 경우, 쓸데없이 API 사용되지 않는가 DropBox측에서 체크 들어가는 것 같다( 참조 ). 이번에는 기존 폴더를 사용할 생각이었기 때문에 없음.

  • 첫 게시물이었습니다. 그 밖에도 GAS로 여러가지 실장하고 있으므로, 그 주위 기고할 수 있으면 좋겠습니다.

    좋은 웹페이지 즐겨찾기