90% 時間直接省下:射出開模&量產成本即算器
每次要抓防水外殼的開模和量產成本,Excel 算式打半天,打錯一格,全部報價亂掉。我自己跑專案時,最怕業務突然問「模費怎麼攤到單價?」「1 萬顆多少?」。用這工具,3 分鐘一次輸入,歷史紀錄自動存,公式全自動,過往報價全都留底。真的,效率差 10 倍。
複製下面程式碼,省掉反覆估價的 90% 麻煩
這個工具一次輸入,馬上計算模具費用分攤、單價、總額,並記錄每次估算,歷史紀錄隨時調閱。
// === 射出開模 & 量產成本即算器 ===
function doGet(e) {
var html = [];
html.push('<html><head>');
html.push('<meta name="viewport" content="width=device-width,initial-scale=1">');
html.push('<title>防水外殼-成本即算</title>');
html.push('<style>body{font-family:sans-serif;background:#f8f9fa;}' +
'.wrapper{max-width:410px;margin:24px auto;padding:30px 24px;' +
'background:#fff;border-radius:12px;box-shadow:0 2px 8px #0002;}' +
'input,select{width:90%;padding:6px;margin-bottom:10px;}' +
'.btn{background:#1976d2;color:#fff;border:none;padding:10px 16px;' +
'border-radius:5px;cursor:pointer;font-size:1rem;}' +
'.history{margin-top:30px;background:#f1f3f4;padding:12px;' +
'border-radius:8px;font-size:0.96em;}' +
'.stat{background:#e3f2fd;padding:8px 10px;border-radius:6px;margin-bottom:14px;}' +
'</style></head>');
html.push('<body><div class="wrapper">');
html.push('<h2>防水外殼-成本即算器</h2>');
html.push('<form id="calcForm">');
html.push('<div>模具費用 (元):<br>' +
'<input type="number" min="1" step="1" id="moldFee" required></div>');
html.push('<div>單件材料費 (元):<br>' +
'<input type="number" min="0.1" step="0.01" id="matFee" required></div>');
html.push('<div>單件射出加工費 (元):<br>' +
'<input type="number" min="0" step="0.01" id="injFee" required></div>');
html.push('<div>目標產量:<br>' +
'<input type="number" min="100" step="1" id="qty" required></div>');
html.push('<div>需求等級:<br>' +
'<select id="grade">' +
'<option>一般防潑水</option>' +
'<option>IP67(高防水)</option>' +
'<option>抗紫外光戶外等級</option>' +
'</select></div>');
html.push('<button type="button" class="btn" onclick="submitForm()">估算</button>');
html.push('</form>');
html.push('<div id="result"></div>');
html.push('<div class="history"><strong>過往估算紀錄</strong>' +
'<div id="historyList">讀取中...</div></div>');
html.push('<script>');
html.push('function submitForm(){' +
'var m=document.getElementById("moldFee").value;' +
'var a=document.getElementById("matFee").value;' +
'var i=document.getElementById("injFee").value;' +
'var q=document.getElementById("qty").value;' +
'var g=document.getElementById("grade").value;' +
'if(!m||!a||!i||!q){alert("欄位不能空");return;}' +
'document.getElementById("result").innerHTML="計算中...";' +
'google.script.run.withSuccessHandler(showResult).calcCost(' +
'Number(m),Number(a),Number(i),Number(q),g);' +
'}' +
'function showResult(res){' +
'document.getElementById("result").innerHTML=res.html;' +
'updateHistory();' +
'}' +
'function updateHistory(){' +
'google.script.run.withSuccessHandler(function(data){' +
'document.getElementById("historyList").innerHTML = data;' +
'}).getHistory();' +
'}' +
'window.onload=updateHistory;</script>');
html.push('</div></body></html>');
return HtmlService.createHtmlOutput(html.join(''));
}
// 主計算與寫入
function calcCost(moldFee, matFee, injFee, qty, grade) {
var sheet = getSheet_();
var mold_each = Math.round(moldFee / qty * 100) / 100;
var total_unit = Math.round((mold_each + matFee + injFee) * 100) / 100;
var total_sum = Math.round((total_unit * qty) * 100) / 100;
// 寫入一筆
var now = new Date();
sheet.appendRow([now, moldFee, matFee, injFee, qty, grade,
mold_each, total_unit, total_sum]);
// 輸出 HTML 給前端
var msg = '<div class="stat">單顆模具分攤: '+mold_each+' 元</div>';
msg += '<div class="stat">單件總成本: '+total_unit+' 元</div>';
msg += '<div class="stat">全部金額: '+total_sum+' 元</div>';
msg += '<div style="color:#607d8b;font-size:0.93em">需求等級: '+grade+'</div>';
return {html: msg};
}
// 歷史查詢
function getHistory(){
var sheet = getSheet_();
var arr = sheet.getRange(Math.max(2,sheet.getLastRow()-9),1,sheet.getLastRow()>1?Math.min(10,sheet.getLastRow()-1):0,9)
.getValues();
if (arr.length==0) return '無紀錄';
var txt = '';
for(var i=arr.length-1;i>=0;i--){
txt += '<div style="border-bottom:1px #ddd solid;padding:4px 0;">';
txt += arr[i][0].toLocaleString()+' | '+arr[i][4]+'顆 | '+arr[i][5]+' | ';
txt += '單價:'+arr[i][7]+' | 總:'+arr[i][8]+'</div>';
}
return txt;
}
// 建立/抓取 Sheet
function getSheet_(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var name = "射出成本紀錄";
var sheet = ss.getSheetByName(name);
if(!sheet){
sheet = ss.insertSheet(name,0);
sheet.appendRow(["時間","模具費","材料費","射出加工費","產量","等級","模分攤","單價","總價"]);
}
return sheet;
}
只要 6 步,所有射出成本一鍵搞定
超簡單,不會卡,連新手都能成功!
- 打開 Apps Script 編輯器
動作:開啟你想記錄的 Google 試算表,點選「擴充功能」→「Apps Script」
位置:「擴充功能」在最上方選單列中間偏右
結果:瀏覽器自動開啟一個新分頁,出現 Apps Script 編輯器
⚠️ 我之前幫同事設的時候,他公司帳號直接被擋,建議用自己私人帳戶先測,避免浪費時間。
- 全選、清空、貼上新程式碼
動作:Ctrl+A 全選,按 Delete,然後將上方程式碼 Ctrl+V 貼上
位置:白色編輯區正中央,光標要閃爍在最前面
結果:原本那行 `function myFunction()` 完全消失,換成新內容
⚠️ 上次有個新手工程師問我,程式碼沒貼完整還一直跑錯,真的要從頭到尾貼好。
- 儲存專案
動作:點磁碟片圖示(左上方工具列)或直接 Ctrl+S
位置:編輯器畫面最上方左側區塊,旁邊有「專案名稱」欄
結果:如果是第一次儲存,會跳出要你取個名字(隨便填一個就行)
⚠️ 我自己每次都亂取,完全不影響使用,有存檔才安全。
- 部署為網頁應用程式
動作:右上角藍色「部署」→「新增部署作業」
位置:「部署」在右上角,很明顯
結果:彈出一個部署設定的小視窗
子步驟:
1. 點齒輪圖案,選「網頁應用程式」
2. 「執行身份」選「我」
3. 「誰可以存取」選「任何人」
4. 按「部署」
⚠️ 新手很容易選錯存取權限,「任何人」一定要選,不然外部同事打不開。
- 授權同意與警告處理
動作:跳出 Google 權限視窗,按下去走流程即可
結果:出現紅色警告「Google 尚未驗證這個應用程式」
處理:點「進階」→「前往(不安全)」→「允許」
⚠️ 我第一次看到也嚇到,後來問了資深 IT 前輩,這只是你自家專案沒送 Google 審核,大家都這樣用,不用擔心。
- 複製網址開啟,隨時估算
動作:複製畫面上顯示的 `https://script.google.com/...` 網址
位置:授權完成後畫面自動彈出,或從部署清單查看
結果:貼到新分頁,表單馬上可用,每次估算自動記錄在你那份 Sheet 裡
⚠️ 改了程式碼,記得重新部署,不然網址不會更新新功能。
⚠️ 關於紅色授權警告畫面怎麼辦?
這是 Google 的預設警示,只要你寫的新程式沒申請公開審查,都會出現這個訊息。我自己第一次也覺得怪怪的,問過做 IT 的朋友,確定只要自己開發、自己和內部同事用,這步驟是必經過程。點「進階」然後「前往(不安全)」就能繼續,不會有資安疑慮(程式全部你看得到,自己掌控)。
真實場景:讓工程溝通和報價都變快 10 倍
一個朋友做設計公司,之前每接一個新專案,都要反覆開 Excel 算「外殼開模費怎麼灑到單價」,最後還得一條一條手記紀錄,常常算一算就亂掉。後來用這工具,一邊試各種生產數量,一邊即時看到攤提結果,客戶臨時改需求,五秒內重算,再也沒搞丟紀錄。還有一回,生產線那邊回報單價異動,也只要換個材料費重按一次,全流程紀錄都留底,連老闆追問時都能直接抓數據出來。
這種事,新手也能做,真的省超多時間。