今回は、Gmail(無料アカウント)のメールを、
Google Apps Scriptを利用して一括でダウンロードしたときのメモです。
以下のような内容になります。
- 予めラベルとフィルターで、ダウンロード対象をグルーピング化しておく。
- Google Apps Scriptのコードを作成して、上記1でグルーピングした該当ラベルのメールをPDF形式で、
Googleドライブに格納するように実装する。(格納先フォルダも自動的に作成する) - 対象メールは、全未読メールのみ。(PDFで格納されるとメールは既読になる)
- PDF名は、メール受信日付_メールタイトルの形式とする。
尚、今回の内容には1点問題があります。
試したところメールに表示されている画像など一部の情報は、欠落した形でPDF化されました。
こちらを対応する場合、別のアプローチが必要だと思います。
(印刷ボタンを押し、別タブで開かれた印刷画面上でPDF保存するような動作を再現する必要あり)
※左が元メール、右がPDF化されたメール
Gmailグルーピング(ラベル付+フィルター)
まずは、ラベルとフィルター設定でメールのグルーピングを行います。
一般的なGmailの設定で行います。
フィルタとブロック中のアドレスを開きます。
画面中程に存在する、新しいフィルタを作成をクリックします。
送信元などを指定してフィルタを作成をクリックします。
その後、ラベル付与(ラベル作成込み)と、一致するスレッドにもフィルターを適用するにチェックを入れます。
※一致するスレッドにもフィルターを適用するにチェックを入れると、
即座にラベルでメールの絞り込みを行えます。(チェックを入れないとで受信済みメールはフィルターされません)
ラベルの作成は、ラベル選択のところから行えます。
Google Apps Scriptコード作成
続けて、実際にメールをPDF化+Googleドライブに配置してくれるコードを作成します。
処理の中でPDFを配置してくれるフォルダも作ることにします。
どこでも良いですが、今回はコードを配置するフォルダを作成してから試しました。
(メールを配置するフォルダと別でもOKです)
右クリックメニューよりその他 -> Google Apps Scriptを選択します。
以下のような確認が表示された場合、スクリプトを作成をクリックします。
無題のプロジェクトが作成されます。
既存のmyFuncitonを修正して、以下の内容を記述します。
function exportMailsToPdf() {
const labelName = '対象メールラベル名'; // メールをPDF化してダウンロードするラベルを指定します
const exportFolderName = 'メールバックアップフォルダ名'; // メールPDF配置フォルダ名を指定します
const parentFolderName = '親フォルダ'; // メールPDF配置フォルダの親フォルダ名を指定します
const label = GmailApp.getUserLabelByName(labelName);
if (!label) throw new Error('ラベルが見つかりません');
const threads = label.getThreads();
const folder = getOrCreateSubFolder(parentFolderName, exportFolderName);
threads.forEach(thread => {
const messages = thread.getMessages();
messages.forEach(message => {
if (message.isUnread()) {
const subject = sanitizeFileName(message.getSubject());
const date = Utilities.formatDate(
message.getDate(),
'Asia/Tokyo',
'yyyyMMdd'
);
const html = message.getBody();
const blob = Utilities.newBlob(html, 'text/html')
.getAs('application/pdf')
.setName(`${date}_${subject}.pdf`);
folder.createFile(blob);
message.markRead();
}
});
});
}
// 親フォルダ確認 and 子フォルダ作成
function getOrCreateSubFolder(parentName, childName) {
const parents = DriveApp.getFoldersByName(parentName);
if (!parents.hasNext()) {
throw new Error(`親フォルダ ${parentName} が見つかりません`);
}
const parent = parents.next();
const children = parent.getFoldersByName(childName);
return children.hasNext()
? children.next()
: parent.createFolder(childName);
}
// ファイル名用文字列整形
function sanitizeFileName(name) {
return name.replace(/[\/\\:*?"<>|]/g, '').slice(0, 50);
}
こちらのコードの以下部分、ラベル名・作業フォルダ名・親フォルダ名は、それぞれの名称を指定します。
その後、ctrl + s(command + s)コマンドなどで保存を行います。
また、必須ではありませんが、作成したプロジェクトを保管する場合、
無題のプロジェクト名の部分をクリックして命名することができます。
実行確認
コードが作成できたら、実行の部分をクリックして動作確認します。
※デバッグの右側に表示されている文字が、exportMailsToPdfの関数名と異なる場合、選択してから実行を行います。
初めて実行すると、確認が表示されますので詳細をクリックします。
続けて、プロジェクト名(安全ではないページ)に移動をクリックします。
すると権限設定が表示されますので、
GmailとGoogleドライブにチェックを入れて続行をクリックします。
実行され実行ログが表示されます。
実行完了の場合、コード上で指定されたフォルダにメールがpdf出力されていることを確認します。
今回のメモは以上となります。
Google Apps Scriptで行えば、インフラ用意もコストもかからず対応できます。
また、簡単な定期実行であればトリガーから設定もできるので、
定期的なメール監視なども行えて便利です。




















