前回のブログではファイルをZip形式にしてメールを送る方法を紹介いたしました。
今回はその逆となる
といった作業を自動で取得するスクリプトをご紹介します。
まずは特定のGmailを取得する方法からご説明します。
今回はGmailの件名で検索し、メールデータを取得する方法をご紹介します。
対象となるメールは以下の画像のメールを使用しました。
件名 | zip付きメール |
添付ファイル名 | createZipFile(zipファイル) |
検索対象からgmail検索し添付ファイルを取得
まずは対象となるメールを件名で検索し、メールデータと添付データを取得するメソッドは次の3つを利用します。
- searchメソッド
- getMessagesForThreadsメソッド
- getAttachmentsメソッド
初めてコードを実行する際にアクセス権限の許可を求められますが許可をしてください。アクセス権限についての詳細は以下の記事に詳しく載っています。
メールの検索
search(query, start, max)
検索クエリを使ってGmailを検索することができます。
引数 | データ型 | 説明 |
---|---|---|
query | String(文字列) | 検索クエリの文字列 |
start | Integer(数値) | スレッドがある場合、スレッド検索の開始数(基本は0) |
max | Integer(数値) | スレッドの最大数 *注意点を以下で説明します |
Gmailの読み込み数について(最大数の設定時の注意)
Gmailの読み込み数について(最大数の設定時の注意)
スクリプトで検索などをする場合各機能で制限が設けられています。
制限の内容については下記の記事で詳しく説明していますので、ご確認ください。
有料版と無料版でも違いがありますが、参考までに無料版を見てみると
Gmailの読み込み・書き込み 1日:20,000件まで
となっています。
そのため、maxに大きな数字を設定して、メールの読み込み回数が上限数を超えてしまうとエラーが出てしまいますので、ご注意ください。
スレッド情報を取得
getMessagesForThreads()
特定のスレッドのメッセージデータを取得します。
searchメソッドで取得したメールはスレッドという1まとまりで取得されます。
スレッドが無ければ1つのメールだけがスレッドに格納された状態でデータが取得されます。
メールにある添付ファイルを取得
getAttachments()
このメソッドでは取得したメールに添付されているファイル情報を取得します。
Zipファイルを展開
unzip()
このメソッドを使うことによってzipファイルを展開する事ができます。
setContentTypeFromExtension()という部分を指定しないとエラーが出ますので、忘れずにファイルの拡張子を指定してから展開するようにしましょう。
説明だけではわかりづらいですので、サンプルコードを見ていきましょう。
サンプルコード
function searchZipMail(){
////前半部分解説
const title = "zip付きメール" //件名設定
//searchメソッド 開始0番目、最大検索数10にしています
const searchGmail = GmailApp.search(title, 0, 10);
//getMessagesForThreadsメソッド(2次元配列が取得されます)
const threadsGmail = GmailApp.getMessagesForThreads(searchGmail);
let zipAttachments, unzipFile;
//2次元配列で取得されているのでループを2回行います
for (let i in threadsGmail) {
//2次元配列2回目のループ
for (let j in threadsGmail[i]) {
//メールの件名をログ出力します
console.log(threadsGmail[i][j].getSubject());
//getAttachmentsメソッドで添付ファイルが取得されます
zipAttachments = threadsGmail[i][j].getAttachments();
} //2次元配列2回目のループ終了
} //2次元配列1回目のループ終了
////前半部分終了
////後半部分解説
//添付ファイル数分ループして取得をします(今回は1つの添付ファイルのみ)
for (i in zipAttachments) {
//参考のため添付ファイル名をログ取得します
console.log(zipAttachments[i].getName());
//unzipメソッドでzipファイルを展開します
unzipFile = Utilities.unzip(zipAttachments[i].setContentTypeFromExtension());
}
//フォルダー場所を取得します(太字部分は各自フォルダIDを入れてください)
const folder = DriveApp.getFolderById("1YTWmbQxCnnuLtgD8VhCTcV6xDAbsEPiT");
//展開するファイルが複数の場合があるためここでもループを行います
for (i in unzipFile) {
//ファイルを指定したフォルダに保存します
folder.createFile(unzipFile[i]);
}
}
前半部分の処理の流れ
searchメソッドでメールの件名をキーワードにメール(スレッド)を取得
getMessagesForThreadsメソッドで、スレッドから1つ1つのメールデータを取得します。
この際2次元配列として返されることに注意が必要です。
例)下記の条件で同じ件名のメールが3通あった場合…
1スレッド目にはメールが1つ
2スレッド目にはメールが2つ
3スレッド目にはメールが3つ
スレッドに格納されている場合、下記のような形で2次元配列に格納されます。
[
[1スレッド目のメール1],
[2スレッド目のメール1, 2スレッド目のメール2],
[3スレッド目のメール1, 3スレッド目のメール2, 3スレッド目のメール3],
]
getAttachmentsメソッドでメールから添付ファイルを取得しています。
今回は添付ファイルは1つですが、添付ファイルが複数存在する可能性もありますので、添付ファイルは配列で取得されます。
前半部分では、メールデータや添付ファイルの取得部分の処理を記載しています。
後半部分では、取得したZipファイルからファイルを展開し、フォルダに保存するようにしてあります。
スクリプト実行結果
このスクリプトを実行すると以下のログが出力されます。
最初のサンプルメールと同じ件名、添付ファイル名が出力されていますね。
そして指定したフォルダには以下の画像のように展開されたファイルが入っています。
注意点
今回ご紹介したunzipメソッドですがzipファイルがパスワードで鍵がかけられている場合、
開くことができませんのでご注意ください。
有志の開発者がパスワード保護されているZIPファイルを展開するGASのライブラリを提供しているようなので、情報共有しておきます。
ライブラリをスクリプトに適用する場合は、下記のスクリプトコードを利用してライブラリを登録してください。
スクリプトID | 1yeBx1bM_6T-Tt2S3e-wxSgphR2QdhM7r0YRYAUTXzDkbRIrvJdHNZT0R |
まとめ
今回はメールで受信したzipファイルを指定したフォルダに保存するという方法をご紹介しました。
この方法を使えば、例えば
件名:2020/12/01日報
添付:zipファイル
のようなメールから毎朝前日の添付ファイル付き日報メールを指定フォルダに展開することができます。
毎日メールをチェックして指定のフォルダに保存をするといった作業が減り、システムが必ず実行してくれるので、他の重要な業務に空いた時間を使うことができるようになりますので作業効率がアップしますね。
ぜひ活用してみて下さい。
コメント
コメント一覧 (4件)
このままだと使えないようです。
通りすがりさん
ご指摘ありがとうございました。
コードの29行目のループの変数が間違えておりました。
Utilities.unzip(zipAttachments[w]) → Utilities.unzip(zipAttachments[k])
記事内のコードも修正しましたので、うまく動作するかどうかご確認いただければと思います。
貴重なご意見ありがとうございます。
件名とフォルダIDの部分のみ変更しましたが、以下のエラーがでます。ご確認お願いいたします。
TypeError: Cannot read properties of undefined (reading ‘getSubject’)
searchZipMail @ コード.gs:15
あさしんさん
コメントありがとうございます。
記事を全体的にリライトし、コードも全体的に修正してみましたので、再度コピーして試していただければと思います。
何かありましたらまたコメントを頂ければと思います。