0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gmailの受信ボックスに存在する添付PDFファイルを、GASでGoogleドライブに保存しURL化する ※メール検索条件指定あり

Last updated at Posted at 2024-12-28

はじめに

※本記事は、GAS(Google Apps Script)やバッチファイルを使って、バックオフィス周りの業務効率化、業務改善を実施している非エンジニアによる記事です。

Gmailで受信するメールの中には、PDFファイルが添付されているものがあります。これらのPDFファイルを手動でダウンロードしてGoogleドライブに保存するのは。量が多くなればなるほど、かなり手間がかかります。

この記事では、Google Apps Script (GAS) を活用して以下を自動化する方法を紹介します。


実践するスクリプトの概要

  1. 指定した送信元アドレスから受信したメールの中で、特定の文言を含む件名のメールを検索。
  2. 添付されているPDFファイルをGoogleドライブに保存。
  3. 保存したPDFのURLをスプレッドシートの指定タブに反映。
    ※私は、毎月電子契約で締結されるサービス解約書類(70~100件)をリンク化して、確認業務をスムーズに行うことが出来ています。(もちろん、電子契約サービスの管理画面から確認することもできますが、仕様上1件1件確認するために少々手間がかかっていました。)

コードの全体像

以下は今回のタスクを実現するGASのスクリプトです。

※下記のGoogleドライブのフォルダID取得したいPDFの送信元のアドレスは、ご自身で適切なものを記載ください。

const FOLDERID = 'GoogleドライブのフォルダIDを反映'; // フォルダIDを記載
const query = title + ' has:attachment from:取得したいPDFの送信元のアドレス'; // Gmail検索クエリ

コード

function getPdfFromGmail() {
  // スプレッドシートを取得
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheetname = 'PDF取得';
  const sheet = spreadsheet.getSheetByName(sheetname);
  console.log(sheetname);
  
  // C列の最終行を取得
  const lastRow = sheet.getRange(sheet.getMaxRows(), 3).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); // C列の最終列を取得
  console.log(lastRow);

  // 保存先のドライブフォルダを指定
  const FOLDERID = 'GoogleドライブのフォルダIDを反映'; // フォルダIDを記載
  const folder = DriveApp.getFolderById(FOLDERID); // 指定のフォルダを取得

  // スプレッドシートのD列を上から最終行まで処理
  for (let row = 3; row <= lastRow; row++) {
    const title = sheet.getRange(row, 4).getValue(); // メールタイトルを取得
    console.log(title);
    const query = title + ' has:attachment from:取得したいPDFの送信元のアドレス'; // Gmail検索クエリ
    console.log(query);
    
    const threads = GmailApp.search(query); // 条件に一致するスレッドを取得
    const messages = GmailApp.getMessagesForThreads(threads); // スレッドのメッセージを取得

    // メッセージから添付ファイルを取得してフォルダに保存
    for (const thread of messages) {
      for (const message of thread) {
        const attachments = message.getAttachments();      
        for (const attachment of attachments) {          
          console.log(attachment.getName());
          const file = folder.createFile(attachment); // ドライブに添付ファイルを保存
          const fileUrl = file.getUrl(); // ファイルのURLを取得
          console.log(fileUrl);
          const lastcol = sheet.getRange(row, sheet.getMaxColumns()).getNextDataCell(SpreadsheetApp.Direction.PREVIOUS).getColumn(); // 最終列を取得
          console.log(lastcol);          
          // 最終列が4未満なら4列目に、それ以降なら次の列にURLを反映
          if (lastcol < 4) {
            sheet.getRange(row, 4).setValue(fileUrl);
          } else {
            sheet.getRange(row, lastcol + 1).setValue(fileUrl);
          }
        }
      }
    }
  }
}     


スクリプトの機能解説

1. Gmailの検索クエリを使用

以下の条件でGmailを検索します。

  • 件名にD列のタイトルが含まれている。
  • 添付ファイルが存在する。
  • 送信元が指定したメールアドレスである。

2. 添付ファイルをGoogleドライブに保存

取得した添付ファイルを、指定したGoogleドライブフォルダに保存します。

3. URLをスプレッドシートに反映

保存したファイルのURLを、「PDF取得」タブのD列以降に書き込みます。


実行手順

  1. Googleスプレッドシートを作成
    「PDF取得」という名前のシートを作成し、C列にPDF取得したいメールのタイトルを入力します。
    ※D列以降は、GASで反映するPDFリンクの列とします。
    ※添付のようなフォーマットにしてください。
    image.png

  2. Google Apps Scriptプロジェクトを作成
    拡張機能Apps Scriptをクリックし、GASプロジェクトを新規作成し、上記コードをコピー&ペーストしてください。

  3. スクリプトを実行
    「getPdfFromGmail」を実行すると、条件に一致するPDFファイルがGoogleドライブに保存され、スプレッドシートにURLが反映されます。
    image.png

スプレッドシートのメニューバーからスクリプト実行できるようにしておくと便利です。
やり方はこちらから

image.png


おわりに

いかがでしたでしょうか。
このスクリプトを活用すれば、Gmailの添付PDFファイルを効率よく取得できます。特に、定型的な処理や、大量のファイル管理が必要な場面で非常に便利です。ぜひ、カスタマイズして業務に役立ててください!


0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?