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保存などに応用すれば、社内の帳票業務を大幅に効率化できる