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/以下の文字列になります。
3-2. メイン
メインについて参考サイトのものを改変させて使っております。
改変したのはメールの読み出し部分で、参考サイトのものだと30件分の中に複数検索条件に
適合するメールがあった場合、複数読み込むことになっているのですが、今回は更新していきたいので、
最新のものだけ使用するように**myMessages[0][0]**と指定しています。
3-3. フォルダの中に入ってるファイルの名前を取得
ここについては名前通りなのですが、最初に指定したフォルダに入っている
ファイル名をすべて取得して返却します。
3-4. フォルダにあるファイル名が添付ファイル名と同じとき更新
3-3で取得したファイル名と添付ファイルのファイル名を比較して、
重複したファイルがある場合、そのファイルを削除して添付ファイルを保存します。
4. 参考文献
-
[Google Apps ScriptでGmailの添付ファイルをGoogleドライブに保存する]
(https://tonari-it.com/gas-gmail-attachment-drive/) -
[GoogleAppsScriptでファイル一覧の取得(Googleドライブ)]
(http://www.googleappsscript.info/2017-07-27/drive_list_folder.html)
5. おわりに
本当は取得したPDFをエクセルに変換してgoogleドライブに保存までしたかったのですが、
PDFに書いてある表が相性が悪いのか変換の精度が悪く、PDFXchangeeditorで手動変換に
落ち着きました。
どなたかお詳しい方、何か知恵がありましたらコメントしていただけると嬉しいです!
最後に記事をお読みいただきありがとうございました。