GASでPDFを自動生成してメール送付する仕組みを作る方法

Google Apps Script(GAS)を使えば、スプレッドシートのデータからPDFを自動生成し、指定のアドレスへ自動メール送信する仕組みをゼロコストで構築できます。

「毎月末に請求書を手作業でPDF化してメールしている」「見積書をいちいちダウンロードして添付するのが面倒」といった業務は、GASで完全自動化できます。Googleドライブ上のスプレッドシートやドキュメントをPDF変換して添付メール送信するスクリプトを一度作ってしまえば、ボタン一つ・あるいはスケジュール実行で完結します。

本記事では、スプレッドシートの内容をPDF化してGmailで送付するまでの具体的な手順をステップ形式で解説します。GASの基本的な操作経験があれば、30〜60分で動くものが作れます。

この記事でできること

  • GASからスプレッドシートをPDF形式に変換してドライブに保存
  • 生成したPDFをGmailの添付ファイルとして自動送信
  • 送信先・件名・本文をスプレッドシートのセルで管理する構成
  • 月次・週次などのスケジュール実行で完全自動化

事前準備

以下のものを用意してください。

  • Googleアカウント(GmailとDriveが使えること)
  • PDF化したい内容を入力したGoogleスプレッドシート(例:請求書テンプレート)
  • GASエディタへのアクセス(スプレッドシートのメニューから「拡張機能」→「Apps Script」で開く)

スプレッドシートには「送信先メールアドレス」「件名」「本文」をセルに入力しておくと、スクリプト側で参照できて柔軟に使えます。今回は A1:メールアドレス、A2:件名、A3:本文 のシンプルな構成で進めます。

STEP1: スプレッドシートのIDを確認する

GASでスプレッドシートをPDF化するには、対象ファイルのIDが必要です。スプレッドシートのURLの /d/ 以降の長い文字列がファイルIDです。GASスクリプトはそのスプレッドシートと紐付いて動くため、SpreadsheetApp.getActiveSpreadsheet().getId() で自動取得できます。

STEP2: GASでPDF変換とメール送信のスクリプトを書く

GASエディタを開き、以下のスクリプトを貼り付けてください。DriveApp の getAs メソッドを使うと、スプレッドシートをPDFとして取得できます。

function generateAndSendPDF() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet1');

  // 送信情報をシートから取得
  var toEmail = sheet.getRange('A1').getValue();
  var subject = sheet.getRange('A2').getValue();
  var body    = sheet.getRange('A3').getValue();

  // DriveAppでPDF形式に変換する
  var ssFile  = DriveApp.getFileById(ss.getId());
  var pdfBlob = ssFile.getAs(MimeType.PDF).setName(subject + '.pdf');

  // Gmailで添付送信
  GmailApp.sendEmail(toEmail, subject, body, {
    attachments: [pdfBlob]
  });
  Logger.log('送信完了: ' + toEmail);
}

スクリプトを保存したら「実行」ボタンで動作確認します。初回はGmail・DriveへのPermissionが求められるので「許可」してください。

STEP3: スプレッドシートに送信情報を入力する

Sheet1 の A1〜A3 に以下のように入力してください。

A1: recipient@example.com
A2: 【5月分】請求書送付のご案内
A3: お世話になっております。5月分の請求書をPDFにてお送りします。ご確認ください。

スプレッドシートの他の部分(B列以降)に請求書データを入力しておくと、そのシート全体がPDFになります。印刷範囲を設定しておくと余白のない綺麗なPDFになります。

STEP4: 複数の取引先に一括送信する

複数取引先に一括送信したい場合は、「送信リスト」シートを別に用意して繰り返し処理にします。「送信リスト」シートには1行目をヘッダー(メール・件名・本文)として、2行目以降に各取引先の情報を入力します。スクリプトはリストを上から読み込み、1件ずつPDFを生成して送信します。連続送信によるレート制限を避けるため、送信間に Utilities.sleep() で待機時間を入れることを推奨します。

ループ処理の骨格は以下のとおりです。PDF生成とメール送信の部分はSTEP2のコードと同じロジックをそのまま使えます。

function sendBulkPDF() {
  var ss        = SpreadsheetApp.getActiveSpreadsheet();
  var listSheet = ss.getSheetByName('送信リスト');
  var lastRow   = listSheet.getLastRow();

  for (var i = 2; i <= lastRow; i++) {
    var toEmail = listSheet.getRange(i, 1).getValue();
    var subject = listSheet.getRange(i, 2).getValue();
    var body    = listSheet.getRange(i, 3).getValue();

    // PDF生成とメール送信はSTEP2と同じロジックを記述
    // ...

    Utilities.sleep(1500); // 連続送信間の待機(ミリ秒)
  }
  Logger.log('一括送信完了');
}

STEP5: スケジュール実行で月末に自動送信する

手動実行ではなく月末や特定日時に自動送信するにはトリガーを設定します。GASエディタ左メニューの「トリガー(時計アイコン)」をクリックし、「トリガーを追加」→ 関数を「generateAndSendPDF」に設定→ イベントのソース:「時間主導型」、タイプ:「月タイマー」→ 日と時刻を設定して「保存」します。これで毎月指定日の指定時刻に自動実行されます。

うまくいかないときのチェックリスト

  • 「Authorization error」→ スクリプトのPermissionを再度許可。GASエディタの「実行」→「権限を確認」から再認証
  • PDFが空白・崩れる → スプレッドシートの印刷範囲を設定しているか確認。「ファイル」→「印刷」でプレビュー確認
  • メールが届かない → toEmailの値が正しいか、A1セルをLogger.logで出力して確認
  • 「Service invoked too many times」→ sleep値を増やすか、処理を分割して実行する
  • PDFサイズが大きい → 画像や未使用シートを削除してからPDF化するとサイズを抑えられる

応用・発展

  • Googleドキュメント版:DocumentApp.openById()で取得したドキュメントも同様にMimeType.PDFでBlob化できます
  • DriveへのPDF保存:DriveApp.createFile(pdfBlob) で送信前にDriveへバックアップ保存する運用も可能です
  • フォームと組み合わせる:Googleフォーム送信をトリガーにして、回答内容をPDFにして即時返信するシステムも構築できます
  • Slackへの通知:送信完了後にSlackのWebhookでチャンネルに通知を飛ばすと、チーム全体で送信状況を把握できます

まとめ

  • DriveApp.getFileById(ssId).getAs(MimeType.PDF) でスプレッドシートをPDF化できる
  • GmailApp.sendEmail の attachments オプションで添付ファイル付きメール送信が可能
  • 送信情報(宛先・件名・本文)をシートのセルで管理することで、スクリプト変更なしに運用できる
  • 月末の自動実行はトリガー設定で「月タイマー」を使う
  • 一括送信・Docs対応・Drive保存などに応用すれば、社内の帳票業務を大幅に効率化できる

コメント

コメントを残す

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

CAPTCHA