GAS×PDF操作|作成・変換・結合を自動化する完全ガイド
毎月の請求書PDF送付、レポートのPDF変換と保存、スプレッドシートからの一括PDF出力。手作業でやっている人は多いが、GASを使えばすべて自動化できる。
スプレッドシートやドキュメントのPDF変換から、Googleドライブへの保存、Gmailでのメール送信まで、一連の処理をスクリプトに任せられる。
目次
GASでできるPDF操作一覧
対応している操作
| 操作 | 対応 | 説明 |
|---|---|---|
| スプレッドシート→PDF | ✅ | シート全体・範囲指定・複数シート |
| ドキュメント→PDF | ✅ | Googleドキュメント全体 |
| スライド→PDF | ✅ | Googleスライド全体 |
| PDF保存 | ✅ | Googleドライブに自動保存 |
| PDFメール添付 | ✅ | Gmail経由で送信 |
| PDF結合 | ⚠️ | 外部ライブラリ必要 |
| PDF編集 | ❌ | GAS単体では不可 |
基本的な仕組み
GASでのPDF変換は、3ステップで処理が進む。
1. 対象ファイル(スプレッドシート等)を取得
2. PDF形式でエクスポート(Blob取得)
3. Googleドライブに保存 or メール添付
スプレッドシートをPDFに変換
基本コード:シート全体をPDF化
/**
* アクティブなスプレッドシートをPDFに変換してドライブに保存
*/
function convertSpreadsheetToPDF() {
// スプレッドシートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ssId = ss.getId();
// PDF変換用のURL(エクスポートAPI)
const url = `https://docs.google.com/spreadsheets/d/${ssId}/export?format=pdf`;
// 認証トークンを取得
const token = ScriptApp.getOAuthToken();
// PDFを取得
const response = UrlFetchApp.fetch(url, {
headers: { 'Authorization': 'Bearer ' + token }
});
// Blobとして取得
const blob = response.getBlob().setName(ss.getName() + '.pdf');
// Googleドライブに保存
const file = DriveApp.createFile(blob);
console.log('PDF保存完了: ' + file.getUrl());
return file;
}
PDF変換オプション一覧
URLパラメータでPDFの出力形式を細かく制御できる。
| パラメータ | 値 | 説明 |
|---|---|---|
format |
出力形式(固定) | |
size |
A4, letter, legal | 用紙サイズ |
portrait |
true/false | 縦向き/横向き |
fitw |
true/false | 幅に合わせる |
gridlines |
true/false | グリッド線表示 |
printtitle |
true/false | タイトル表示 |
sheetnames |
true/false | シート名表示 |
pagenumbers |
true/false | ページ番号表示 |
gid |
シートID | 特定シートのみ出力 |
range |
A1:D10 | 範囲指定 |
オプション付きの変換コード
/**
* オプションを指定してPDF変換
*/
function convertToPDFWithOptions() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const ssId = ss.getId();
const sheetId = sheet.getSheetId();
// PDFオプションを設定
const options = {
format: 'pdf',
size: 'A4', // 用紙サイズ
portrait: 'true', // 縦向き
fitw: 'true', // 幅に合わせる
gridlines: 'false', // グリッド線なし
printtitle: 'false', // タイトルなし
sheetnames: 'false', // シート名なし
pagenumbers: 'false', // ページ番号なし
gid: sheetId // 特定シートのみ
};
// URLパラメータを構築
const params = Object.entries(options)
.map(([key, value]) => `${key}=${value}`)
.join('&');
const url = `https://docs.google.com/spreadsheets/d/${ssId}/export?${params}`;
// PDF取得
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(url, {
headers: { 'Authorization': 'Bearer ' + token }
});
const blob = response.getBlob().setName(sheet.getName() + '.pdf');
const file = DriveApp.createFile(blob);
console.log('PDF保存完了: ' + file.getUrl());
return file;
}
特定の範囲のみPDF化
/**
* 指定範囲のみをPDF化
*/
function convertRangeToPDF() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const ssId = ss.getId();
const sheetId = sheet.getSheetId();
// 出力範囲を指定(例: A1:F20)
const range = 'A1:F20';
const options = {
format: 'pdf',
size: 'A4',
portrait: 'true',
fitw: 'true',
gridlines: 'false',
gid: sheetId,
range: range // 範囲指定
};
const params = Object.entries(options)
.map(([key, value]) => `${key}=${encodeURIComponent(value)}`)
.join('&');
const url = `https://docs.google.com/spreadsheets/d/${ssId}/export?${params}`;
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(url, {
headers: { 'Authorization': 'Bearer ' + token }
});
const blob = response.getBlob().setName('範囲出力_' + new Date().toISOString().slice(0,10) + '.pdf');
return DriveApp.createFile(blob);
}
ドキュメントをPDFに変換
GoogleドキュメントのPDF変換は、スプレッドシートよりシンプルに書ける。getAs() メソッドを呼ぶだけでよい。
/**
* GoogleドキュメントをPDFに変換
*/
function convertDocToPDF() {
// ドキュメントIDを指定(URLの /d/ と /edit の間の文字列)
const docId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
// ドキュメントを取得
const doc = DocumentApp.openById(docId);
// PDFとしてエクスポート
const blob = doc.getAs('application/pdf');
blob.setName(doc.getName() + '.pdf');
// ドライブに保存
const file = DriveApp.createFile(blob);
console.log('PDF保存完了: ' + file.getUrl());
return file;
}
/**
* アクティブなドキュメントをPDF化(ドキュメントにバインドしたスクリプト用)
*/
function convertActiveDocToPDF() {
const doc = DocumentApp.getActiveDocument();
const blob = doc.getAs('application/pdf');
blob.setName(doc.getName() + '.pdf');
return DriveApp.createFile(blob);
}
PDFをGoogleドライブに自動保存
指定フォルダに保存
/**
* PDFを指定フォルダに保存
*/
function savePDFToFolder() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ssId = ss.getId();
// 保存先フォルダID(フォルダURLの /folders/ 以降の文字列)
const folderId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const folder = DriveApp.getFolderById(folderId);
// PDF生成
const url = `https://docs.google.com/spreadsheets/d/${ssId}/export?format=pdf&size=A4&portrait=true`;
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(url, {
headers: { 'Authorization': 'Bearer ' + token }
});
// ファイル名に日付を付加
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd');
const fileName = `レポート_${today}.pdf`;
const blob = response.getBlob().setName(fileName);
// 指定フォルダに保存
const file = folder.createFile(blob);
console.log('保存完了: ' + file.getUrl());
return file;
}
月別フォルダに自動整理
/**
* 月別フォルダに自動保存
*/
function savePDFToMonthlyFolder() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ssId = ss.getId();
// 親フォルダを取得
const parentFolderId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const parentFolder = DriveApp.getFolderById(parentFolderId);
// 今月のフォルダ名(例: 2026-02)
const today = new Date();
const monthFolderName = Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy-MM');
// 月別フォルダを取得または作成
let monthFolder;
const folders = parentFolder.getFoldersByName(monthFolderName);
if (folders.hasNext()) {
monthFolder = folders.next();
} else {
monthFolder = parentFolder.createFolder(monthFolderName);
}
// PDF生成・保存
const url = `https://docs.google.com/spreadsheets/d/${ssId}/export?format=pdf`;
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(url, {
headers: { 'Authorization': 'Bearer ' + token }
});
const fileName = `レポート_${Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy-MM-dd_HHmm')}.pdf`;
const blob = response.getBlob().setName(fileName);
const file = monthFolder.createFile(blob);
console.log('保存完了: ' + file.getUrl());
return file;
}
実践例:請求書の自動PDF化
請求書テンプレートからPDFを生成し、メールで送る。月次の請求業務をまるごと自動化するコードを紹介する。
請求書スプレッドシートの構成
【シート1: 請求書テンプレート】
A1: 請求書
B3: 請求先: {{会社名}}
B4: ご担当: {{担当者名}} 様
...
D10: 合計: {{合計金額}} 円
【シート2: 顧客データ】
A列: 会社名
B列: 担当者名
C列: メールアドレス
D列: 合計金額
E列: 送信済みフラグ
請求書PDF自動生成・送信コード
/**
* 請求書PDF自動生成・メール送信
*/
function generateAndSendInvoices() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const templateSheet = ss.getSheetByName('請求書テンプレート');
const dataSheet = ss.getSheetByName('顧客データ');
// 顧客データを取得
const data = dataSheet.getDataRange().getValues();
const header = data[0];
const customers = data.slice(1);
// 列インデックスを取得
const colCompany = header.indexOf('会社名');
const colPerson = header.indexOf('担当者名');
const colEmail = header.indexOf('メールアドレス');
const colAmount = header.indexOf('合計金額');
const colSent = header.indexOf('送信済み');
let sentCount = 0;
customers.forEach((customer, index) => {
// 送信済みはスキップ
if (customer[colSent] === '済') return;
const company = customer[colCompany];
const person = customer[colPerson];
const email = customer[colEmail];
const amount = customer[colAmount];
// テンプレートに値を設定
templateSheet.getRange('B3').setValue('請求先: ' + company);
templateSheet.getRange('B4').setValue('ご担当: ' + person + ' 様');
templateSheet.getRange('D10').setValue('合計: ' + amount.toLocaleString() + ' 円');
// 変更を反映
SpreadsheetApp.flush();
// PDFを生成
const pdf = generateInvoicePDF(ss.getId(), templateSheet.getSheetId(), company);
// メール送信
sendInvoiceEmail(email, company, person, pdf);
// 送信済みフラグを更新
dataSheet.getRange(index + 2, colSent + 1).setValue('済');
sentCount++;
// API制限対策(1秒待機)
Utilities.sleep(1000);
});
console.log(`送信完了: ${sentCount}件`);
}
/**
* 請求書PDFを生成
*/
function generateInvoicePDF(ssId, sheetId, company) {
const options = {
format: 'pdf',
size: 'A4',
portrait: 'true',
fitw: 'true',
gridlines: 'false',
printtitle: 'false',
sheetnames: 'false',
gid: sheetId
};
const params = Object.entries(options)
.map(([key, value]) => `${key}=${value}`)
.join('&');
const url = `https://docs.google.com/spreadsheets/d/${ssId}/export?${params}`;
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(url, {
headers: { 'Authorization': 'Bearer ' + token }
});
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd');
const fileName = `請求書_${company}_${today}.pdf`;
return response.getBlob().setName(fileName);
}
/**
* 請求書メールを送信
*/
function sendInvoiceEmail(email, company, person, pdfBlob) {
const subject = `【請求書送付】${Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy年MM月')}分`;
const body = `${company}
${person} 様
いつもお世話になっております。
${Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy年MM月')}分の請求書を添付にてお送りいたします。
ご確認のほど、よろしくお願いいたします。
お支払い期限:${Utilities.formatDate(new Date(Date.now() + 30*24*60*60*1000), 'Asia/Tokyo', 'yyyy年MM月dd日')}
ご不明点がございましたら、お気軽にお問い合わせください。
---
株式会社サンプル
経理部
`;
GmailApp.sendEmail(email, subject, body, {
attachments: [pdfBlob]
});
}
トリガーで月次自動実行
毎月1日に自動実行する手順は以下のとおり。
- Apps Scriptエディタで「トリガー」を開く
- 「トリガーを追加」を選択
- 設定:
– 実行する関数: generateAndSendInvoices
– イベントのソース: 時間主導型
– トリガーのタイプ: 月ベースのタイマー
– 日: 1日
– 時刻: 午前9時〜10時
メール添付で自動送信
シンプルなPDF添付メール
/**
* PDFを生成してメール送信
*/
function sendPDFByEmail() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ssId = ss.getId();
// PDF生成
const url = `https://docs.google.com/spreadsheets/d/${ssId}/export?format=pdf&size=A4`;
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(url, {
headers: { 'Authorization': 'Bearer ' + token }
});
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd');
const blob = response.getBlob().setName(`レポート_${today}.pdf`);
// メール送信
GmailApp.sendEmail(
'recipient@example.com', // 宛先
`日次レポート(${today})`, // 件名
'お疲れ様です。\n\n本日のレポートを添付します。', // 本文
{
attachments: [blob],
name: '自動レポートシステム' // 送信者名
}
);
console.log('メール送信完了');
}
まとめ
今回のポイント
- スプレッドシート→PDF: エクスポートAPIとURLパラメータで柔軟に変換する
- ドキュメント→PDF:
getAs('application/pdf')だけで済む - 自動保存: フォルダ指定や月別整理もスクリプトに任せられる
- 請求書自動化: テンプレート、データ、メール送信を組み合わせれば手作業はゼロになる
PDF変換オプション早見表
| 用途 | パラメータ |
|---|---|
| A4縦 | size=A4&portrait=true |
| A4横 | size=A4&portrait=false |
| グリッド線なし | gridlines=false |
| 特定シート | gid=シートID |
| 範囲指定 | range=A1:D10 |
活用シーン
- 月次レポートの自動PDF化とメール送信
- 請求書の一括生成・配信
- 契約書テンプレートのPDF出力
- 日報・週報の自動アーカイブ
PDF操作の自動化は、一度組んでしまえば毎月の定型業務から解放される。まずは1つのスプレッドシートのPDF変換から試してみるとよい。
コメント