LoginSignup
8
12

More than 3 years have passed since last update.

【gas】gmailの添付ファイルをドライブに保存、更新

Last updated at Posted at 2019-09-27

1. はじめに

ご覧いただきありがとうございます。

今回は業務でメールのPDFを取り出しそのファイルを重複しないように
googleドライブに上げたいと考えgasを使用して実装してみました。

2. ソースコード

まずは完成品のソースコードをご覧ください。

//定数
var SEARCH_TERM = 'subject:(○○○○) '; //検索条件(件名で検索の場合)
var FOLDER = DriveApp.getFolderById('○○○○'); //保存するフォルダ(Googledrive上のURL”folders/”以下)

//メイン(メールから添付ファイルを取得)
function fetchFile(){
  var myThreads = GmailApp.search(SEARCH_TERM, 0, 30); //条件にマッチしたスレッドを検索して取得(0~30件まで)
  var myMessages = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得し二次元配列で格納
  var attachments = myMessages[0][0].getAttachments(); //添付ファイルを取得

  Logger.log(myMessages[0][0].getSubject());  //取得メールの件名表示
  updateFile(attachments)  //ファイル置き換え
}

//フォルダの中に入ってるファイルの名前を取得
function getFileNames(){
  var files = FOLDER.getFiles();
  var fileNames = []
  var count = 0

  while (files.hasNext()) {
    fileNames[count] = files.next()
    count++
  }

  return fileNames
}

//フォルダにあるファイル名が添付ファイル名と同じとき更新
function updateFile(attachments){
  var fileNames = getFileNames()
  for(var i in attachments){
    for(var j in fileNames){
      //ドライブにすでに同じ名前のファイルがあるか?
      if(attachments[i].getName() == fileNames[j]){
        var files = DriveApp.getFilesByName(fileNames[j])
    //重複ファイルを削除
        if (files.hasNext()) {
          var file = files.next()
          file.setTrashed(true)
          Logger.log(file.getName())  //削除したファイル名表示
        }
      }
    }
    FOLDER.createFile(attachments[i]) //ドライブに添付ファイルを保存
  }
}

3. コード解説・補足

ブロックごとに解説と補足説明していきます。

3-1. 定数

var SEARCH_TERM = 'subject:(○○○○)';
検索条件の設定です。
今回のプログラムでは欲しいPDFの添付されているメールは同じ件名で送られてくるため
件名で検索しています。
'○○○○'の部分は部分的な検索なので、例えば給料明細のお知らせが
「○○月の給与明細」という件名で送られてくる場合'subject:(月の給与明細)'と指定しておけば
きちんと取得できると思います。

var FOLDER = DriveApp.getFolderById('○○○○');
'○○○○'の部分は保存したいフォルダを開いた状態のfolders/以下の文字列になります。

【参考画像】
無題.png

3-2. メイン

メインについて参考サイトのものを改変させて使っております。
改変したのはメールの読み出し部分で、参考サイトのものだと30件分の中に複数検索条件に
適合するメールがあった場合、複数読み込むことになっているのですが、今回は更新していきたいので、
最新のものだけ使用するようにmyMessages[0][0]と指定しています。

3-3. フォルダの中に入ってるファイルの名前を取得

ここについては名前通りなのですが、最初に指定したフォルダに入っている
ファイル名をすべて取得して返却します。

3-4. フォルダにあるファイル名が添付ファイル名と同じとき更新

3-3で取得したファイル名と添付ファイルのファイル名を比較して、
重複したファイルがある場合、そのファイルを削除して添付ファイルを保存します。

4. 参考文献

5. おわりに

本当は取得したPDFをエクセルに変換してgoogleドライブに保存までしたかったのですが、
PDFに書いてある表が相性が悪いのか変換の精度が悪く、PDFXchangeeditorで手動変換に
落ち着きました。
どなたかお詳しい方、何か知恵がありましたらコメントしていただけると嬉しいです!

最後に記事をお読みいただきありがとうございました。

8
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12