GASで請求書を自動生成しメール送信まで完結

GAS業務自動化メール
GASで請求書を自動生成しメール送信まで完結のサムネイル

GASで請求書を自動生成しメール送信まで完結


こんにちは、GASおじです。今日は中小企業の経営者さんやフリーランスの皆さんに役立つ、Google Apps Script(以下GAS)を使った請求書の自動生成とメール送信の方法を解説します。請求書作成は地味に時間がかかる作業ですが、これをGASで自動化すれば、作業効率アップとミス削減が期待できますよ。


なぜGASで請求書自動生成?

GASはGoogleアカウントの利用枠内で追加の専用SaaS料金なしに使えます。ただしApps Scriptのquotaや実行上限はあるので注意が必要です。請求書作成に必要な顧客データや商品情報はGoogleスプレッドシートにまとめておき、GASで処理するのが基本的な流れ。これなら既存のデータを壊さずに管理できて安心です。

また、GASならメール送信も同時に処理可能。請求書PDFを作ってメール添付することもできますが、今回はスプレッドシートの請求書シートをPDFに変換してメール送信する例をお見せします。


初期設定と必要権限について

  1. スプレッドシートの用意
     請求書の元データ(顧客名、商品、単価、数量など)を管理するシートと、請求書テンプレートのシートを用意しておきます。
  2. GASプロジェクトを作成
     Googleスプレッドシートのメニューから「拡張機能」→「Apps Script」を開いてコードを書きます。
  3. 必要な権限
     - スプレッドシートの読み書き権限
     - Gmail送信権限
  4. installable triggerの設定(任意)
     請求書作成を定期的に実行したい場合は時間主導型トリガーを設定します。
  5. 個人情報の取扱い
     スプレッドシートに顧客の個人情報を保存するため、アクセス権限の管理を徹底してください。
  6. 復元手順
     既存データは削除しない設計のため、誤操作があってもバックアップから復元がスムーズです。定期的にスプレッドシートのコピーを取ることをお勧めします。

請求書自動生成&メール送信のコード例

以下は、請求書データを元に新しい日時付きの請求書シートを作成し、PDF化してメール送信するサンプルコードです。既存データは一切削除せず、新しいシートに書き出す形で安全に処理しています。

function generateAndSendInvoice() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const dataSheet = ss.getSheetByName('請求データ'); // 顧客&請求情報
  const templateSheet = ss.getSheetByName('請求書テンプレート'); // 請求書テンプレートシート

  if (!dataSheet || !templateSheet) {
    throw new Error('必要なシートが存在しません。');
  }

  // 請求データの最終行を取得(ヘッダー除く)
  const lastRow = dataSheet.getLastRow();
  if (lastRow < 2) {
    throw new Error('請求データがありません。');
  }

  // 1件ずつ処理(バッチ書き込みのため配列で処理)
  const dataRange = dataSheet.getRange(2, 1, lastRow -1, dataSheet.getLastColumn());
  const records = dataRange.getValues();

  // バックアップ用シート作成(存在すればスキップ)
  let backupSheet = ss.getSheetByName('請求データバックアップ');
  if (!backupSheet) {
    backupSheet = ss.insertSheet('請求データバックアップ');
    // ヘッダーコピー
    const header = dataSheet.getRange(1,1,1,dataSheet.getLastColumn()).getValues();
    backupSheet.getRange(1,1,1,header[0].length).setValues(header);
  }
  // バックアップデータ書き込み(追記形式)
  backupSheet.getRange(backupSheet.getLastRow()+1, 1, records.length, records[0].length).setValues(records);

  // 入力検証例(顧客メールアドレスが空の場合はスキップ)
  const validRecords = records.filter(row => {
    const email = row[2]; // メールアドレスが3列目と仮定
    return email && email.toString().indexOf('@') > 0;
  });

  validRecords.forEach(record => {
    const [顧客名, 請求日, メールアドレス, 商品名, 単価, 数量] = record;

    // 請求書シートを複製(テンプレートから)
    const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
    const invoiceSheetName = `請求書_${顧客名}_${timestamp}`;
    const invoiceSheet = templateSheet.copyTo(ss).setName(invoiceSheetName);

    // テンプレートの特定セルに値をセット
    invoiceSheet.getRange('B2').setValue(顧客名);
    invoiceSheet.getRange('B3').setValue(請求日);
    invoiceSheet.getRange('B5').setValue(`${商品名} × ${数量}`);
    invoiceSheet.getRange('B6').setValue(単価);
    invoiceSheet.getRange('B7').setValue(単価 * 数量);

    // PDF化してメール送信
    const pdfBlob = exportSheetToPDF(ss.getId(), invoiceSheet.getSheetId(), invoiceSheetName);
    GmailApp.sendEmail(メールアドレス, '【請求書】' + timestamp, '請求書を添付します。ご確認ください。', {
      attachments: [pdfBlob],
      name: 'GASおじ請求システム'
    });

    // 処理完了後はシートを非表示にしてデータを残す(削除はしない)
    invoiceSheet.hideSheet();
  });
}

/**
 * 指定スプレッドシートの指定シートをPDFに変換してBlobで返す。
 */
function exportSheetToPDF(spreadsheetId, sheetId, filename) {
  const url = `https://docs.google.com/spreadsheets/d/${spreadsheetId}/export?exportFormat=pdf&format=pdf` +
    `&gid=${sheetId}` +
    `&size=A4` +
    `&portrait=true` +
    `&fitw=true` +
    `&sheetnames=false&printtitle=false&pagenumbers=false` +
    `&gridlines=false&fzr=false`;

  const token = ScriptApp.getOAuthToken();
  const response = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' + token
    }
  });
  const blob = response.getBlob().setName(filename + '.pdf');
  return blob;
}

コスト削減の仮定計算

例えば請求書作成に月20時間かかっていた作業をこのスクリプトで自動化できた場合を考えましょう。

  • 時間単価:2,500円/時間
  • 削減時間:20時間/月
  • 削減コスト:2,500円 × 20時間 = 50,000円/月

年間では50,000円 × 12ヶ月 = 600,000円のコスト削減が見込めます。ただしこれはあくまで仮定の計算式です。実際の導入効果は環境や運用状況によって変わりますのでご注意ください。


復元と運用のポイント

  • スクリプトは既存の請求データを削除せず、バックアップシートに追記形式で保存します。
  • 請求書はテンプレートのコピーを作成して書き換え、元データは安全に残ります。
  • 請求書シートは送信後に非表示にしますが、必要なら手動で再表示可能です。
  • 万が一の誤操作時は「請求データバックアップ」シートから元データを復元できます。
  • installable triggerで定期実行も可能ですが、初回は手動で動作確認を必ず行ってください。

GASで業務のムダを削減し、請求書作成をスマートにしたい方はぜひチャレンジしてみてください。拡張性も高いので、自社の業務フローに合わせてカスタマイズ可能です。


GASおじラボで500ツール使い放題 →