cherry blossoms, blossoms, ornamental cherry, spring flowers, spring, sakura, white, tender, lighting mood, nature, springtime, spring flower, mood, spring awakening, sunlight, light, purple

Google Apps Script Gmail 一括 PDF ダウンロード

今回は、Gmail(無料アカウント)のメールを、
Google Apps Scriptを利用して一括でダウンロードしたときのメモです。
以下のような内容になります。

  1. 予めラベルとフィルターで、ダウンロード対象をグルーピング化しておく。
  2. Google Apps Scriptのコードを作成して、上記1でグルーピングした該当ラベルのメールをPDF形式で、
    Googleドライブに格納するように実装する。(格納先フォルダも自動的に作成する)
  3. 対象メールは、全未読メールのみ。(PDFで格納されるとメールは既読になる)
  4. PDF名は、メール受信日付_メールタイトルの形式とする。

尚、今回の内容には1点問題があります。
試したところメールに表示されている画像など一部の情報は、欠落した形でPDF化されました。
こちらを対応する場合、別のアプローチが必要だと思います。
(印刷ボタンを押し、別タブで開かれた印刷画面上でPDF保存するような動作を再現する必要あり)

※左が元メール、右がPDF化されたメール

gmail convert to pdf image error


Gmailグルーピング(ラベル付+フィルター)

まずは、ラベルとフィルター設定でメールのグルーピングを行います。
一般的なGmailの設定で行います。

gmail label filter

フィルタとブロック中のアドレスを開きます。

gmail label filter

画面中程に存在する、新しいフィルタを作成をクリックします。

gmail label filter

送信元などを指定してフィルタを作成をクリックします。

gmail label filter

その後、ラベル付与(ラベル作成込み)と、一致するスレッドにもフィルターを適用するにチェックを入れます。
※一致するスレッドにもフィルターを適用するにチェックを入れると、
即座にラベルでメールの絞り込みを行えます。(チェックを入れないとで受信済みメールはフィルターされません)

gmail label filter

ラベルの作成は、ラベル選択のところから行えます。

gmail label filter


Google Apps Scriptコード作成

続けて、実際にメールをPDF化+Googleドライブに配置してくれるコードを作成します。
処理の中でPDFを配置してくれるフォルダも作ることにします。

どこでも良いですが、今回はコードを配置するフォルダを作成してから試しました。
(メールを配置するフォルダと別でもOKです)

google apps script gmail convert to pdf

右クリックメニューよりその他 -> Google Apps Scriptを選択します。

google apps script gmail convert to pdf

以下のような確認が表示された場合、スクリプトを作成をクリックします。

google apps script gmail convert to pdf

無題のプロジェクトが作成されます。

google apps script gmail convert to pdf

既存の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);
}

google apps script gmail convert to pdf

こちらのコードの以下部分、ラベル名・作業フォルダ名・親フォルダ名は、それぞれの名称を指定します。

google apps script gmail convert to pdf

その後、ctrl + s(command + s)コマンドなどで保存を行います。

また、必須ではありませんが、作成したプロジェクトを保管する場合、
無題のプロジェクト名の部分をクリックして命名することができます。

google apps script gmail convert to pdf

google apps script gmail convert to pdf


実行確認

コードが作成できたら、実行の部分をクリックして動作確認します。
※デバッグの右側に表示されている文字が、exportMailsToPdfの関数名と異なる場合、選択してから実行を行います。

google apps script gmail convert to pdf

初めて実行すると、確認が表示されますので詳細をクリックします。

google apps script gmail convert to pdf

続けて、プロジェクト名(安全ではないページ)に移動をクリックします。

google apps script gmail convert to pdf

すると権限設定が表示されますので、
GmailとGoogleドライブにチェックを入れて続行をクリックします。

google apps script gmail convert to pdf

実行され実行ログが表示されます。
実行完了の場合、コード上で指定されたフォルダにメールがpdf出力されていることを確認します。

google apps script gmail convert to pdf

 

google apps script gmail convert to pdf


今回のメモは以上となります。
Google Apps Scriptで行えば、インフラ用意もコストもかからず対応できます。
また、簡単な定期実行であればトリガーから設定もできるので、
定期的なメール監視なども行えて便利です。

都内でエンジニアをやっています。 2017年に脱サラ(法人設立)しました。 仕事で調べたことや、気になったことをメモしています。
投稿を作成しました 188

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る