專業級塑膠射出委外估價試算工具|完整自動報價分析流程
塑膠射出委外報價老是搞不清楚合理範圍?尤其材料用量、單價、機台成本和不良率,每次算到頭暈還被業務追問數字。之前幫朋友估價時,就踩過一次大雷:不良率沒加進成本,報出去整個低到老闆直接開罵。這工具,就是為這種複雜又重複的試算設計的——把用量、單價、加工費、不良率通通自動記錄計算,還能查看歷史紀錄。就這麼直接。業界朋友也常建議,這類成本絕不能「用手算+LINE對話」結案,那遲早出包。別再靠經驗法則賭報價了。
標準化塑膠射出委外成本自動試算表|複製這段程式直接用
這工具會提供完整輸入欄位、即時計算、記錄每筆估價與分析,直接寫入並讀取 Google Sheet。跟著我一步步操作。
// === 塑膠射出委外成本試算 Apps Script 工具 ===
function doGet(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('委外成本紀錄');
if (!sheet) {
// 建新表格加標題
sheet = ss.insertSheet('委外成本紀錄');
sheet.appendRow([
'日期', '品名', '預計產量', '材料單價(元/kg)', '單件材料用量(g)',
'加工單價(元)', '不良率(%)', '總材料成本',
'總加工費', '總成本', '單件總成本'
]);
}
// 準備歷史紀錄
var lastRows = sheet.getLastRow() > 1 ?
sheet.getRange(2,1,Math.min(sheet.getLastRow()-1,10),11).getValues() : [];
// UI
var html = [];
html.push('<html><head>');
html.push('<meta name="viewport" content="width=device-width, initial-scale=1">');
html.push('<style>body{font-family:sans-serif;}th,td{padding:3px;}</style>');
html.push('</head><body style="background:#f7f7f7">');
html.push('<h2>塑膠射出委外成本標準試算表</h2>');
html.push('<form id="inputForm">');
html.push('<label>品名:<input name="pname" required></label><br>');
html.push('<label>預計產量(件):<input name="qty" type="number" required></label><br>');
html.push('<label>材料單價(元/kg):<input name="price_kg" type="number" step="0.01" required></label><br>');
html.push('<label>單件材料用量(g):<input name="g_per" type="number" step="0.01" required></label><br>');
html.push('<label>加工單價(元/件):<input name="proc_price" type="number" step="0.01" required></label><br>');
html.push('<label>不良率(%):<input name="bad_rate" type="number" step="0.1" value="2"></label><br>');
html.push('<button type="button" onclick="submitForm()">試算+記錄</button>');
html.push('</form>');
html.push('<div id="result" style="margin:18px 0 0 0;"></div>');
html.push('<hr><h4>最近10筆試算紀錄</h4>');
html.push('<table border="1" style="background:#fff;"><tr>');
var headers = [
'日期','品名','預計產量','材料單價',
'單件材料用量','加工單價','不良率','總材料成本','總加工費','總成本','單件總成本'
];
headers.forEach(function(t){html.push('<th>'+t+'</th>')});
html.push('</tr>');
if (lastRows.length) {
lastRows.forEach(function(r){
html.push('<tr>');
r.forEach(function(x){html.push('<td>'+x+'</td>')});
html.push('</tr>');
});
} else {
html.push('<tr><td colspan="11">暫無紀錄</td></tr>');
}
html.push('</table>');
// JS
html.push('<script>function submitForm(){'
+ 'var fd=new FormData(document.getElementById("inputForm"));'
+ 'var obj={};fd.forEach(function(v,k){obj[k]=v;});'
+ 'fetch("?action=save", {method:"POST",body:JSON.stringify(obj)})'
+ '.then(x=>x.json()).then(function(res){'
+ 'document.getElementById("result").innerHTML=res.html;'
+ 'if(res.success)location.reload();'
+ '});'
+ '}</script>');
html.push('</body></html>');
return HtmlService.createHtmlOutput(html.join('')).setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
// 接收POST寫入sheet並回應計算結果
function doPost(e) {
var d = JSON.parse(e.postData.contents);
var pname = d.pname||'';
var qty = Number(d.qty)||0;
var price_kg = Number(d.price_kg)||0;
var g_per = Number(d.g_per)||0;
var proc_price = Number(d.proc_price)||0;
var bad_rate = Number(d.bad_rate)||0;
// 計算不良數
var bad_cnt = Math.ceil(qty * (bad_rate/100));
var total_qty = qty + bad_cnt;
var total_material_kg = (total_qty * g_per)/1000;
var mat_cost = Math.round(total_material_kg * price_kg * 100)/100;
var proc_cost = Math.round(qty * proc_price * 100)/100;
var total_cost = Math.round((mat_cost+proc_cost)*100)/100;
var unit_cost = Math.round((total_cost/qty)*100)/100;
var dt = Utilities.formatDate(new Date(), 'GMT+8', 'yyyy/MM/dd HH:mm');
// 寫入
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('委外成本紀錄');
sheet.appendRow([
dt, pname, qty, price_kg, g_per, proc_price, bad_rate+'%', mat_cost,
proc_cost, total_cost, unit_cost
]);
// 結果區
var html = '<div style="background:#e8f6e7;padding:12px;">'
+'<strong>總材料成本:</strong>'+mat_cost+' 元<br>'
+'<strong>總加工費:</strong>'+proc_cost+' 元<br>'
+'<strong>總成本:</strong>'+total_cost+' 元<br>'
+'<strong>單件總成本:</strong>'+unit_cost+' 元<br>'
+'(已自動計算不良率及補充材料)</div>';
return ContentService.createTextOutput(JSON.stringify({
success:true,
html: html
})).setMimeType(ContentService.MimeType.JSON);
}
塑膠射出委外成本試算工具:標準部署教學
來,跟著我操作,流程照做穩穩的。
- 開啟 Apps Script 編輯器
動作:打開你的 Google 試算表 → 點選「擴充功能」→「Apps Script」
位置:「擴充功能」在最上方選單列,大約中間偏右
結果:會跳新分頁,直接進到 Apps Script 編輯器
⚠️ 有遇過學員反應公司帳號會被鎖,或是瀏覽器阻擋彈窗,沒開成。遇到這狀況,換自己帳號或調瀏覽器設定。
- 清空並貼上程式碼
動作:全選(Ctrl+A)→ 刪除 → 貼上上面這段程式碼(Ctrl+V)
位置:編輯器中央白色區域(不是側邊的設定,不要貼錯)
結果:預設的 `function myFunction()` 會被蓋掉,看不到原本內容
⚠️ 別以為只加在最下面就好,全部貼上取代才不會亂;斷行沒貼完整,直接就報錯。
- 儲存專案
動作:點「儲存」圖示(磁碟片)或直接 Ctrl+S
位置:編輯器上方最左邊一排圖示
結果:如果是第一次存,會跳視窗要你輸入專案名稱
⚠️ 這裡名稱怎麼打都行,重點是一定要存,不存就部署會噴錯誤。
- 部署為網頁應用程式
動作:點右上角藍色「部署」→「新增部署作業」
位置:「部署」按鈕在最右上
結果:會跳出部署設定視窗
子步驟:
1. 點齒輪選「網頁應用程式」
2. 執行身分選「我」
3. 誰可以存取選「任何人」
4. 點「部署」
⚠️ 一定要「任何人」,否則同事打不開,每次有人沒設到都來問我,白浪費時間。
- 處理授權警告
動作:照畫面按「授權」
結果:會看到紅色警告「Google 尚未驗證這個應用程式」
處理:點「進階」→「前往 XXX(不安全)」→「允許」
⚠️ 很多人看到這就嚇到不敢用。其實你寫的程式沒送審就是會出現,不是中毒。
- 取得網址,開始使用
動作:授權完會顯示一個 `https://script.google.com/...` 網址
位置:授權畫面自動彈出,或在部署紀錄裡也找得到
結果:貼到瀏覽器,直接進入塑膠射出委外成本試算工具
⚠️ 每次修改後要重新部署網址才會套新版,不然用舊網址會卡舊功能。
⚠️ 關於 Google 授權紅色警告畫面解釋
只要是自己寫(或同事寫)、沒經過 Google 官方驗證的 Apps Script 工具,部署時一定會跳出「尚未驗證」的紅色警告。
這是 Google 保護機制,目的是提醒你這個應用沒經過第三方審查。只要你自己貼的程式(不是陌生網站來路不明),照「進階」→「前往」→「允許」操作即可。很多第一次玩的朋友都會嚇到,但這跟病毒無關,是 Google 給開發者的「常態流程」之一。別擔心,用自己帳號部署自己用,安全無虞。
現場實戰:這工具能解決的成本分析窘境
工廠現場 PM 臨時要拉一個報價,但原始數據只給了材料用量和產量。用這工具輸入完,不良率加上去一秒算出單件成本,報價就有憑有據。還有一次,我幫客戶管理委外單,主管直接調出 3 個月歷史紀錄對照,立刻抓到某一批材料單價異常,現場就能直接和供應商對帳,不怕誰亂喊價。用過的人都說,不用再回頭翻筆記本查公式,報價時腦袋終於能空下來想別的事。