```html
「省下 85% 算預算時間!」懶人系統櫥櫃預算即時試算表
抓裝潢預算最怕算錯,特別是櫥櫃這一關。價格一會兒要比材質,一會兒又要拆平方,還要考慮哪些地方省、哪些地方不能省。我自己之前幫家人裝修光是做比較表、抄來抄去就耗掉半天,改個配置又要全部重算一輪。真的會爆炸!現在有這個工具,3 分鐘輸入需求、材料選一選,馬上看到每種搭配的價格落點,還能隨時改、隨時存,省下最少 85% 的預算比對時間。
一鍵複製,打造你自己的櫥櫃預算試算工具
這工具能讓你快速輸入不同空間、材質、數量,當場算出總價,也記錄下所有比價紀錄,想省錢直接看得出哪個搭配最划算。
// === 懶人櫥櫃預算試算工具 ===
function doGet(e) {
var html = [];
html.push('<html><head>');
html.push('<meta name="viewport" content="width=device-width">');
html.push('<title>系統櫥櫃預算即時試算</title>');
html.push('</head><body style="font-family:sans-serif;">');
html.push('<div style="max-width:500px;margin:30px auto;' +
'background:#f8f9fa;padding:24px 18px;border-radius:8px;">');
html.push('<h3 style="color:#00796b;">只要 3 步驟,輸入配置即算預算</h3>');
html.push('<form id="inputForm">');
html.push('1. 空間用途:');
html.push('<select name="area" required>');
html.push('<option value="廚房">廚房</option>');
html.push('<option value="臥室">臥室</option>');
html.push('<option value="客廳">客廳</option>');
html.push('<option value="玄關">玄關</option>');
html.push('</select><br>');
html.push('2. 選擇材質:');
html.push('<select name="material" required>');
html.push('<option value="美耐板">美耐板(約 $6,500/坪)</option>');
html.push('<option value="系統板">系統板(約 $8,000/坪)</option>');
html.push('<option value="超耐磨板">超耐磨板(約 $10,000/坪)</option>');
html.push('</select><br>');
html.push('3. 預估櫥櫃坪數:');
html.push('<input type="number" min="0.1" step="0.1" name="area_size" ' +
'required style="width:70px;"> 坪<br>');
html.push('4. 配件升級:');
html.push('<select name="upgrade" required>');
html.push('<option value="無">無(0元)</option>');
html.push('<option value="緩衝抽屜">緩衝抽屜(+$2,000/坪)</option>');
html.push('<option value="收納拉籃">收納拉籃(+$3,000/坪)</option>');
html.push('</select><br>');
html.push('<button type="submit">立即計算並儲存</button>');
html.push('</form>');
html.push('<div id="result"></div>');
html.push('<hr>');
html.push('<button onclick="google.script.run.withSuccessHandler(showData)' +
'.getSheetData()" style="margin-bottom:12px;">刷新歷史紀錄</button>');
html.push('<div id="history"></div>');
html.push('</div>');
html.push('<script>');
html.push('document.getElementById("inputForm").onsubmit=function(e){');
html.push('e.preventDefault();');
html.push('var fd=new FormData(this),obj={};');
html.push('fd.forEach((v,k)=>obj[k]=v);');
html.push('google.script.run.withSuccessHandler(function(msg){');
html.push('document.getElementById("result").innerHTML=msg;');
html.push('google.script.run.withSuccessHandler(showData).getSheetData();');
html.push('}).processForm(obj);');
html.push('return false;};');
html.push('function showData(arr){');
html.push('var out="<table style=\'width:100%;font-size:13px;\' border=1>";');
html.push('out+="<tr style=\'background:#dedede;\'><th>時間</th>'+
'<th>空間</th><th>材質</th><th>坪數</th><th>升級</th>'+
'<th>預算</th></tr>";');
html.push('for(var i=1;i<arr.length;i++){var d=arr[i];');
html.push('out+="<tr>";for(var j=0;j<d.length;j++)out+="<td>"+d[j]+"</td>";');
html.push('out+="</tr>";}out+="</table>";');
html.push('document.getElementById("history").innerHTML=out;}');
html.push('google.script.run.withSuccessHandler(showData).getSheetData();');
html.push('</script></body></html>');
return HtmlService.createHtmlOutput(html.join(""));
}
// 表單處理
function processForm(obj) {
var priceMap = {
'美耐板': 6500,
'系統板': 8000,
'超耐磨板': 10000
};
var upgradeMap = {
'無': 0,
'緩衝抽屜': 2000,
'收納拉籃': 3000
};
var area = obj['area'] || '未知';
var material = obj['material'] || '美耐板';
var size = parseFloat(obj['area_size'] || 0);
var upgrade = obj['upgrade'] || '無';
// 試算
var amt = (priceMap[material] + upgradeMap[upgrade]) * size;
amt = Math.round(amt);
// 寫入 Google Sheet
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('櫥櫃預算紀錄');
if(!sheet){
sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('櫥櫃預算紀錄');
sheet.appendRow(['時間','空間','材質','坪數','升級','預算(元)']);
}
var now = Utilities.formatDate(new Date(), "Asia/Taipei", "yyyy/MM/dd HH:mm");
sheet.appendRow([now, area, material, size, upgrade, amt]);
// 回傳顯示字串
return '預估金額:' + amt.toLocaleString() + ' 元(已紀錄)';
}
// 歷史資料
function getSheetData() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('櫥櫃預算紀錄');
if(!sheet) return [];
return sheet.getDataRange().getValues();
}
只要 6 步驟,新手也能做出自己的試算表
別怕,很簡單!跟著做,你一定搞得定。
- 開啟 Apps Script 編輯器
動作:打開你想儲存資料的 Google 試算表,點「擴充功能」→「Apps Script」
位置:「擴充功能」在畫面最上方選單,大概在右半邊
結果:會開一個新分頁,進入 Apps Script 編輯器
⚠️ 我曾遇過朋友用公司帳號被擋,或者跳不出新分頁,通常是權限問題或瀏覽器擋彈窗。
- 清空並貼上程式碼
動作:在編輯器中央白色區域,Ctrl+A 全選 → Delete 清掉 → Ctrl+V 貼上上面的完整程式碼
結果:原本預設的 `function myFunction()` 會消失,變成這個新工具的程式碼
⚠️ 有一次我貼一半漏了一段,結果後面都動不了,務必確定「全選-刪-再貼」。
- 儲存專案
動作:點上方工具列的「儲存」磁碟片,或直接 Ctrl+S
結果:第一次存檔會要你取個專案名稱,亂取沒關係
⚠️ 沒存檔就跳去部署,會跳錯!
- 部署為網頁應用程式
動作:右上角藍色「部署」→「新增部署作業」
結果:會跳一個設定視窗
子步驟:
1. 點齒輪,選「網頁應用程式」
2. 執行身分選「我」
3. 誰可以存取記得選「任何人」
4. 點「部署」
⚠️ 有次我忘記選「任何人」,結果測試時只有我能用,超尷尬。
- 處理授權警告
動作:根據提示點選授權,過程會跳紅色警告頁
結果:看到「Google 尚未驗證這個應用程式」不用怕
處理:點「進階」→「前往 XXX(不安全)」→「允許」
⚠️ 第一次看到紅色警告很心驚,其實這是正常的,因為是自己寫的,Google 還沒審過。
- 取得網址,開始使用
動作:複製部署後顯示的網址(`https://script.google.com/...`)
結果:貼到瀏覽器馬上能看到預算工具
⚠️ 只要你改了程式碼記得要重新部署,否則不會即時更新(我自己卡過)。
⚠️ 為什麼會出現紅色授權警告?完全不用怕!
這個畫面是因為 Google 沒有審核你這份 Apps Script,但這是你自己寫、你自己用,只要按「進階」→「前往 XXX(不安全)」→「允許」即可。市面上的 Apps Script 教學幾乎都會遇到。真正的風險只有陌生人分享給你的程式碼,但你這份是在自己帳號的 Sheet 編輯、自己部署,沒有外人可以偷資料,穩!
3 分鐘解決比價混亂,讓你一次搞懂預算落點
情境一:幫爸媽裝修廚房,設計師一直講「如果加緩衝抽、再多一坪,約一萬多吧」,你直接開這個工具,選「廚房」→「超耐磨板」→ 2.5 坪 →「緩衝抽屜」,不用按計算機就看到「預估 30,000 多元」,再馬上換其他材質比較,數字秒換,價格一目了然。
情境二:朋友比價三家廠商,材料、坪數、配件都不一樣,每次改組合就要重算。你直接把每家組合輸入一次,歷史紀錄一行行清楚比,誰貴誰便宜、預算壓力一眼看出來。之前有社團朋友說他光做比價表弄到凌晨,這工具幫他省下兩小時。真的方便。
```