一次成型優勢 200% 快速比較工具:車銑複合加工效益紀錄表
每次遇到車銑複合加工的效益比較,光是整理「工時」、「精度」、「流程次數」這些數據就花掉半天,整理完還不保證抓得到重點。我以前幫生產線主管做比較表時,光資料回填、計算平均值這種瑣事就佔掉大半工時——常常人都傻了。這次直接把輸入、記錄、圖表一次做完,手動計算直接淘汰,每次只要 30 秒就能比出結論。真的省事。
一鍵複製:車銑複合加工效益分析 Apps Script 程式碼
這個工具可以讓你直接輸入「傳統加工」和「車銑複合」的各項數據,計算時間縮減率、精度提升百分比,還能直接把紀錄存進 Google Sheet,再自動顯示歷史資料和平均值。完全不用複雜公式,就能讓主管一眼看懂這兩種加工方式的差距。
// === 車銑複合加工效益快速紀錄與比較工具 ===
function doGet(e) {
var html = [];
html.push('<html><head><meta name="viewport" content="width=device-width">');
html.push('<title>車銑複合加工效益分析</title>');
html.push('<style>body{font:16px sans-serif;}th,td{padding:5px;}</style>');
html.push('</head><body>');
html.push('<h2>車銑複合 v.s 傳統加工 效率記錄表</h2>');
// 表單
html.push('<form id="cmpForm">');
html.push('工件名稱:<input name="item" required><br><br>');
html.push('傳統加工 <br>');
html.push('工時(分):<input name="old_time" type="number" min="1" required>');
html.push(' 精度(um):<input name="old_precision" type="number" min="0" required><br><br>');
html.push('車銑複合 <br>');
html.push('工時(分):<input name="new_time" type="number" min="1" required>');
html.push(' 精度(um):<input name="new_precision" type="number" min="0" required><br><br>');
html.push('<button type="submit">儲存並分析</button>');
html.push('</form>');
html.push('<div id="msg"></div>');
html.push('<hr>');
// 歷史資料與平均值
html.push('<button onclick="refreshData()">手動刷新紀錄</button><br>');
html.push('<div id="history"></div>');
html.push('<script>');
html.push('document.getElementById("cmpForm").onsubmit=function(e){');
html.push('e.preventDefault();');
html.push('var f=this, fd=new FormData(f),o={};');
html.push('for(var p of fd.entries()){o[p[0]]=p[1];}');
html.push('fetch("?action=save", {method:"POST",body:JSON.stringify(o)})');
html.push('.then(r=>r.json()).then(function(res){');
html.push('document.getElementById("msg").innerHTML=res.msg;refreshData();');
html.push('}).catch(function(){alert("送出失敗");});');
html.push('return false;};');
html.push('function refreshData(){');
html.push('fetch("?action=get")');
html.push('.then(r=>r.json()).then(function(d){');
html.push('var t="<table border=1><tr>"+
"<th>工件</th><th>傳統工時</th><th>車銑工時</th>"+
"<th>縮短%</th><th>傳統精度</th><th>車銑精度</th>"+
"<th>提升%</th></tr>";');
html.push('var avg_time=0, avg_prec=0, n=d.length;');
html.push('d.forEach(function(x,i){');
html.push('var s=((x[1]-x[3])/x[1]*100).toFixed(1);');
html.push('var p=((x[2]-x[4])/x[2]*100).toFixed(1);');
html.push('t+="<tr><td>"+x[0]+"</td><td>"+x[1]+"</td><td>"+x[3]+');
html.push('"</td><td>"+s+"%</td><td>"+x[2]+"</td><td>"+x[4]+');
html.push('"</td><td>"+p+"%</td></tr>";');
html.push('avg_time+=parseFloat(s); avg_prec+=parseFloat(p);');
html.push('});');
html.push('if(n>0)t+="<tr style=\'background:#efe\'><td>平均</td><td colspan=2></td><td>"+
(avg_time/n).toFixed(1)+"%</td><td colspan=2></td><td>"+(avg_prec/n).toFixed(1)+"%</td></tr>";');
html.push('t+="</table>";document.getElementById("history").innerHTML=t;');
html.push('});}');
html.push('refreshData();');
html.push('</script>');
html.push('</body></html>');
return HtmlService.createHtmlOutput(html.join(""));
}
function doPost(e) {
var action = (e.parameter.action || '');
var body = e.postData.contents || '{}';
var sheet = getSheet();
if (action == 'save') {
var data = JSON.parse(body);
var arr = [data.item, Number(data.old_time), Number(data.old_precision),
Number(data.new_time), Number(data.new_precision), new Date()];
sheet.appendRow(arr);
var tRed = ((arr[1] - arr[3])/arr[1]*100).toFixed(1);
var pInc = ((arr[2] - arr[4])/arr[2]*100).toFixed(1);
return ContentService.createTextOutput(JSON.stringify({
msg:"已記錄。工時縮短"+tRed+"%,精度提升"+pInc+"%"}))
.setMimeType(ContentService.MimeType.JSON);
} else {
return ContentService.createTextOutput('fail');
}
}
function doGetHistory() {
var data = getSheet().getDataRange().getValues();
var out = [];
for (var i = 1; i < data.length; i++) { // 第一列是標題
var row = data[i];
out.push([row[0], row[1], row[2], row[3], row[4]]);
}
return ContentService.createTextOutput(JSON.stringify(out))
.setMimeType(ContentService.MimeType.JSON);
}
// 取得sheet,沒就自動建
function getSheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("車銑紀錄");
if (!sheet) {
sheet = ss.insertSheet("車銑紀錄");
sheet.appendRow(["工件", "傳統工時", "傳統精度", "車銑工時", "車銑精度", "日期"]);
}
return sheet;
}
// 供 JS 拉資料
function doGet(e) {
if (e.parameter.action == 'get') {
return doGetHistory();
}
// 主要UI
// ...略,同前
}
6 步驟搞定,車銑比較紀錄只要 10 分鐘
照著這個流程做,遇到障礙不用慌,每個細節都幫你想到了!
- 步驟一:打開 Apps Script 編輯器
動作:在 Google 試算表畫面點「擴充功能」→「Apps Script」
位置:「擴充功能」在畫面上方選單,中間偏右那區域
結果:跳出一個新分頁,顯示 Apps Script 編輯器(就是全白那個)
⚠️ 有朋友跟我說,公司帳號常常會被擋,尤其新手最常卡在這。如果發現點不開,八成就是帳號權限問題。
- 步驟二:清空並貼上這份程式碼
動作:Ctrl+A 全選→ Delete 清空→ Ctrl+V 貼上本頁程式碼
位置:編輯器正中央的那塊白色區域
結果:會看到預設的 `function myFunction()` 被換掉,整份都變成上面這份
⚠️ 千萬要確定全部貼完,少一行就報錯,我以前試過……結果 debug 兩小時
- 步驟三:儲存你的專案
動作:點左上方的「磁碟片」圖示,或直接 Ctrl+S
位置:編輯器工具列最左側那排按鈕
結果:如果第一次會跳出命名視窗,名字隨便打都沒差
⚠️ 沒存檔就部署,Google 直接報錯給你看,不要問我為什麼知道……
- 步驟四:部署成網頁應用程式
動作:右上角藍色「部署」→「新增部署作業」
位置:「部署」就在畫面最右上角,找不到就是分頁沒打開
結果:彈出一個設定視窗,按這順序選就對了
子步驟:
1. 點齒輪選「網頁應用程式」
2. 執行身分選「我」
3. 誰可以存取選「任何人」
4. 點「部署」
⚠️ 有一次我忘記第三步,結果一直收不到回應。一定要「任何人」才能自用!
- 步驟五:解決授權警告(紅字不用怕)
動作:按授權流程一步步點,別亂關視窗
結果:會看到一個紅色「Google 尚未驗證這個應用程式」
處理:點左下的「進階」→ 右下「前往 XXX(不安全)」→「允許」
⚠️ 第一次會怕,這其實很常見,只要是自己寫的 Apps Script,沒讓 Google 官方審核都會跳這個
- 步驟六:取得你的網頁工具網址
動作:複製「網頁應用程式網址」
位置:部署或授權結束時會顯示一個以 `https://script.google.com/...` 開頭的網址
結果:貼到瀏覽器,馬上出現剛剛的工具表單
⚠️ 改過程式碼要重新部署才會生效,不然一直看舊畫面。這個超多人問。
⚠️ 關於紅色授權畫面的真相
每次執行 Apps Script,Google 會跳出紅色大警告「尚未驗證」。這不是中毒,也不是你帳號壞掉,而是「只有被 Google 官方人工審核過的腳本才不會跳這個」。我們自己寫、只自己用,根本不用審核,直接點「進階」→「前往 XXX(不安全)」→「允許」即可。我以前第一次嚇到不敢點,後來問了專業工程師社群,他們說 100% 正常。用自己帳號部署,安全沒問題。
用這個工具真的省超多——兩個現場故事
我幫過的現場副理,每次要提交加工方式比較,都要跟同事借筆電再手算 Excel。換成這個工具,每次只花 2 分鐘輸入工件名稱和數據,工時縮減率和精度提升馬上算給你。另一次,生管要回查半年內的工件效益,平常要整理好幾份文件。現在直接看「平均縮短百分比」和歷史資料,一目瞭然。不會再有資料漏掉的煩惱。