請求書作成くん
1. UIのシートの選択肢表示のところを選択、顧客名略称から選択
2. InvoiceTemplateの摘要欄や数量、単価などを必要に応じて入力
4. exportedのシートに作成したPDFファイルの履歴(作成日、ファイル名、URL、会社名など)が入る
clientdataのシートに顧客情報が入っている
これはUIのシートのキャプチャ
薄いグレーの部分はルックアップで取得
https://gyazo.com/aabee2a630babdeb7b066edcec15d303
関数も多用しているのでGoogle Sheetsのほうも公開したい気持ちはあるが各種情報を抜いて公開できる形にするのが面倒でまだやってない exportedのシートのヘッダ
table:exported
作成日 ファイル名 URL clientName num
clientdataのシート
table:clientdata
選択肢表示 clientName clientPostcode clientAddress1 clientAddress2 limitDate id num
test1 株式会社テスト 123-4567 東京都中央区ほげほげ1-2-3 テストビル10階 2024/10/15 INV-0000000001 1
code:javascript.js
function main(){
const today = new Date();
const ssId = PropertiesService.getScriptProperties().getProperty("SHEET_ID");
const folderId = PropertiesService.getScriptProperties().getProperty("FOLDER_ID");
//会社名を取得
let sheet_UI = sheetInit(UI);
let companyName = sheet_UI.getRange("A4").getValue();
//PDFのファイル名を作成
let pdfFileName = companyName + "_" + Utilities.formatDate(today, "GMT", "MM");
//シートをPDFに変換
let data = exportSheetToPDF('InvoiceTemplate',pdfFileName,ssId,folderId);
//numを取り出して更新、スプシの書き換えタイミングの関係で+1後ではなく+1前の番号でPDFが作られてしまうため、このタイミングで加算し次回用にする。docnumには今回の数字が入る
let docNum = addDocNum(clientdata,companyName);
//作成日列を追加
data.unshift(today);
//clientName列を追加
data.push(companyName);
//num列を追加
data.push(docNum);
appendDataToSheetTop(data,'exported');
}
//numを取り出して更新
function addDocNum(sheetName,companyName){
let sheet = sheetInit(sheetName);
// B列全体を取得
const data = sheet .getRange("B:B").getValues();
let hValue = 0;
// B列でcompanyNameを探して一致する行を見つける
for (let i = 0; i < data.length; i++) {
if (datai0 === companyName) { // 一致する行が見つかったら、H列の値を取得し、1を足して再度格納
hValue = sheet.getRange(i + 1, 8).getValue(); // i+1は行番号、8はH列
sheet.getRange(i + 1, 8).setValue(hValue + 1);
break; // 最初の一致で処理を終了
}
}
//hValueには今回の数字が入る
return hValue;
}
function exportSheetToPDF(sheetName,pdfFileName,ssId,folderId) {
// アクティブなスプレッドシートを取得
let spreadsheet = SpreadsheetApp.openById(ssId);
// 指定されたシート名のシートを取得
let sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
Logger.log('指定されたシートが見つかりません: ' + sheetName);
return;
}
// PDF出力のURL
+ 'exportFormat=pdf&format=pdf'
+ '&size=A4'
+ '&portrait=true'
+ '&fitw=true'
+ '&sheetnames=false'
+ '&printtitle=false'
+ '&pagenumbers=false'
+ '&gridlines=false'
+ '&fzr=false'
+ '&gid=' + sheet.getSheetId();
// PDF出力のオプション
let options = {
headers: {
'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
}
};
// PDFファイルを取得
let response = UrlFetchApp.fetch(url, options);
let pdfBlob = response.getBlob().setName(pdfFileName + '.pdf');
// PDFファイルをGoogleドライブに保存
let folder = DriveApp.getFolderById(folderId);
let pdfFile = folder.createFile(pdfBlob);
Logger.log('PDFファイルが作成され、Googleドライブに保存されました: ' + data);
return data;
}
//dataをシートの2行目に追加(見出し行の下)
function appendDataToSheetTop(data,sheetName) {
let sheet = sheetInit(sheetName);
// 2行目の下に新しい行を挿入
sheet.insertRowAfter(1);
// 新しく挿入した行にデータを設定
sheet.getRange(2, 1, 1, data.length).setValues(data); }
//シートの準備、sheetNameを受け取り該当のシートを返す
function sheetInit(sheetName){
const sheetId = PropertiesService.getScriptProperties().getProperty("SHEET_ID");
let ss = SpreadsheetApp.openById(sheetId);
let sheet = ss.getSheetByName(sheetName);
//シートをひらいたときシートがなければ作る
if (!sheet) {
sheet = ss.insertSheet(sheetName);
}
return sheet;
}