2020年9月14日月曜日

ちょっと時短になる請求書と納品書と見積書のテンプレート(スプレッドシート・エクセル)

-----
・追記(2022-6-18)

-----

普段使っている請求書と納品書と見積書のスプレッドシートをテンプレートにしてみました。

請求書とか納品書とか見積書、毎回手書きや手入力しているとまぁまぁ時間かかるのですよね。そんなわけで、時短を意識して作ってあります。バックオフィス業務はただひたすらに効率化あるのみです。

GAS(Google Apps Script)で、保存用PDFの作成とナンバリングカウントの自動化もしています。必要があればお使いください。


請求書と納品書と見積書のテンプレート

・追記(2022-6-22)
新たに請求書等の発行システムを作成しました。今後はそちら(無料かつ時短になる請求書等の発行システム(電子取引の保存要件に対応)
)をお使いください。

・追記(2020-12-1)
時々、アクセス権のリクエストをいただきますが、↓の方法で編集可能なコピーを作成してご使用ください。

PCでGoogleアカウントにログインした状態で、リンク先にて「ファイル」から「コピーを作成」で編集可能なファイルが作成されます。エクセルで使いたい方はファイル作成後にMicrosoft Excel(.xlsx)形式でダウンロードすれば使えると思います。


① テンプレートの使い方

「請求書」「納品書」「見積書」「参照」「取引先」の5つのシートがあります。

「参照」と「取引先」シートは請求書、納品書、見積書内の「宛先」「日付」「振込先」「請求書番号」「納品書番号」「見積書番号」の参照用です。あらかじめ入力しておけば以降はプルダウン リストからの選択が可能になります。日付は今日を起点に前後3日間が表示されるようになっています。

「請求書番号」「納品書番号」「見積書番号」の管理は手動でも可能ですが、後ほどGASで自動化します。

ナンバリングは「20-001」のように西暦下2桁-通し番号3桁となっています。もし取引先番号等を付けたい場合には、取引先に番号をふり、VLOOKUP関数で持ってくればよいかと思います。



都度手入力となるのは「品名」「数量」「単価(税込)」(必要があれば「振込期日」「備考欄」)です。その他はプルダウン リストから選択、もしくは自動計算されます。


納品書、見積書も使い方は同じになります。


② GASでさらに時短 - その1「スプレッドシートのPDF化」

さらなる時短のためGASで請求書、納品書、見積書のPDF化とナンバリングのカウントを自動化します。

発行した請求書、納品書、見積書はPDFファイルとして保存しているのですが、このスプレッドシートからのPDF化が微妙に手間がかかるのですよね。なんやかんや30秒程度でしょうか。Google ドライブ内で保存できればいい場合でも一旦ローカルにファイルが作成されてしまいますし、ファイル名も規則通りに間違えないよう打ち込まねばなりません。ルール通りにやればいいことはプログラムにやってもらった方が早いし間違いがないですね(予期せぬエラーはありますが)。

ということで、まずはPDF化のコードです。

function pdfInv(){
    var folderId = "フォルダーID";
    var spshId = "スプレッドシートID";
    var shtId = "シートID";
    var actSpsh = SpreadsheetApp.getActiveSpreadsheet();
    var sht = actSpsh.getSheetByName("請求書");
    var clName = sht.getRange("A3").getValue();
    var num = sht.getRange("F5").getValue();
    var dateStamp = sht.getRange("F4").getValue();
    var dateStamp = Utilities.formatDate(dateStamp, "JST", "yyyy-MM-dd");
  
    createPDF( folderId, spshId, shtId, "請求書" + "_" + clName + "_" + num + "(" + dateStamp + ")" );
}

function createPDF(folderId, spshId, shtId, fileName){
    var folder = DriveApp.getFolderById(folderId);
    var url = "https://docs.google.com/spreadsheets/d/spshId/export?".replace("spshId", spshId);

    var opts = {
      exportFormat: "pdf",
      format:       "pdf",
      size:         "A4",
      portrait:     "true",
      fitw:         "true",
      sheetnames:   "false",
      printtitle:   "false",
      pagenumbers:  "false",
      gridlines:    "false",
      fzr:          "false",
      gid:          shtId
    };
  
    var url_ext = [];
    for( optName in opts ){
      url_ext.push( optName + "=" + opts[optName] );
    }
    var options = url_ext.join("&");
    var token = ScriptApp.getOAuthToken();
    var response = UrlFetchApp.fetch(url + options, {
      headers: {
        'Authorization': 'Bearer ' +  token
      }
    });
    var blob = response.getBlob().setName(fileName + '.pdf');

    folder.createFile(blob);
}

上記は請求書のPDF化のコードになります。納品書、見積書はまた別にコードを作成する必要があります。

書き換え箇所は以下の通りです。

・1行目「pdfInv」

納品書の場合は「pdfDn」、見積書の場合は「pdfQuot」等、それぞれ関数名を異なるものにしてください。


・2行目「フォルダーID」

PDF化したファイルを保存しておくフォルダになります。フォルダーを開いた状態でURLの下記部分に表示されます。

https://drive.google.com/drive/folders/ここの値をコピペ


・3行目「スプレッドシートID」

スプレッドシートを開いた状態でURLの下記部分に表示されます。

https://docs.google.com/spreadsheets/d/ここの値をコピペ/edit#gid=0


・4行目「シートID」

シートを開いた状態でURLの下記部分に表示されます。

https://docs.google.com/spreadsheets/d/**********/edit#gid=ここの数字をコピペ


・6、12行目「請求書」

納品書、見積書の場合はそれぞれ変更してください。


これでPDF化のコードは完成です。

ファイル名は、

書類名_宛名_書類番号(日付).pdf

という形式になります。(日付が空欄の場合はエラーになります。)


③ GASでさらに時短 - その2「ナンバリングのカウント」

次に請求書番号、納品書番号、見積書番号のナンバリングのカウントです。更新日とともに管理することで間違い防止も兼ねています。

以下コードです。

var spsh = SpreadsheetApp.openById("スプレッドシートID");
var sht = spsh.getSheetByName("参照");

var today = new Date();
var year = Utilities.formatDate(today,"JST","yyyy");
var date = Utilities.formatDate(today,"JST","yyyy/MM/dd");

function countInv() {
    var count = sht.getRange(6,2).getValue();
    count = count + 1;
    var upd = sht.getRange(6,4).getValue();
    var updYear = Utilities.formatDate(upd,"JST","yyyy");
    
    if(year == updYear){
      sht.getRange(6,2).setValue(count);
      sht.getRange(6,4).setValue(date);
    } else {
      sht.getRange(6,2).setValue("1");
      sht.getRange(6,4).setValue(date);      
    }
}

function countDn() {    
    var count = sht.getRange(7,2).getValue();
    count = count + 1;
    var upd = sht.getRange(7,4).getValue();
    var updYear = Utilities.formatDate(upd,"JST","yyyy");
    
    if(year == updYear){
      sht.getRange(7,2).setValue(count);
      sht.getRange(7,4).setValue(date);
    } else {
      sht.getRange(7,2).setValue("1");
      sht.getRange(7,4).setValue(date);    
    }
}

function countQuot() {
    var count = sht.getRange(8,2).getValue();
    count = count + 1;
    var upd = sht.getRange(8,4).getValue();
    var updYear = Utilities.formatDate(upd,"JST","yyyy");
    
    if(year == updYear){
      sht.getRange(8,2).setValue(count);
      sht.getRange(8,4).setValue(date);
    } else {
      sht.getRange(8,2).setValue("1");
      sht.getRange(8,4).setValue(date);    
    }
}

書き換えは1行目の「スプレッドシートID」のみです。PDF化のコードのスプレッドシートIDと同一のものになります。

「countInv」が請求書番号、「countDn」が納品書番号、「countQuot」が見積書番号のカウントをする関数になります。

年の切り替わりで番号はリセットされるようになっています。


***

適宜カスタマイズして使っていただければと思います。


詳解! Google Apps Script完全入門 [第3版]
詳解! Google Apps Script完全入門 [第3版]

by SimpleImageLink

こういう本は紙の方が便利ですね。