MENU

GAS×PDF操作|作成・変換・結合を自動化する完全ガイド

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 pdf 出力形式(固定)
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変換から試してみるとよい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次