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

## はじめに

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

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

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

---

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

---

## コードの全体像

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

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

```javascript
const FOLDERID = 'GoogleドライブのフォルダIDを反映'; // フォルダIDを記載
```

```javascript
const query = title + ' has:attachment from:取得したいPDFの送信元のアドレス'; // Gmail検索クエリ
```


#### コード

```javascript
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/86aa1b03-b17a-cb07-9d76-6ee736387ec1.png)
   <br>

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

3. **スクリプトを実行**  
   「getPdfFromGmail」を実行すると、条件に一致するPDFファイルがGoogleドライブに保存され、スプレッドシートにURLが反映されます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/3d6eed2f-5787-40ac-171e-9a9ed8d9633f.png)

:::note info
スプレッドシートのメニューバーからスクリプト実行できるようにしておくと便利です。
[やり方はこちらから](https://qiita.com/yuto-h/items/a683d8ac45ad00645e98)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/0896dedc-73ec-ea83-8b34-65a0727f3e2f.png)


---

## おわりに

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

---