水電工程材料一站式採購模式:庫存整合、付款條件與採購人員時間成本

Published on: | Last updated:

重點一句話

嗯...一站式採購,聽起來很好。但重點在「整合」,特別是中小工程行,整合不好,比原本還慘。關鍵在付款條件跟庫存管理,不是只有一個窗口打電話就好。

現在大家談的「一站式」,跟我們想的不一樣

剛剛看了幾篇,很多都是B2B平台在推自己的服務。 他們會說價格透明、省時間,聽起來都對。但他們很少提,如果平台上的料號不齊全,或是臨時要改規格,那怎麼辦?採購還是得自己另外找。這就不算「一站式」了。

特別是我們這種中小規模的工程行,案子小、料又雜,不可能像大營造廠那樣有專門的採購部門去跟平台對接。 很多時候是老闆或老師傅自己去叫料。他們要的不是複雜的系統,而是簡單、快速,而且最重要的,是「彈性」。

還有一個問題,現在很多系統都在講數據整合、ERP。 但對我們來說,最大的痛點是現金流。 票期能不能拉長?臨時調貨,價格怎麼算?這些實際問題,比軟體功能更重要。

怎麼做:三個思考點

如果要導入...不管是平台還是一家統包的材料行,要先想清楚這幾件事。

1. 庫存整合,不是丟給廠商就好

「庫存整合」聽起來很專業,但說白了就是:料要放哪?誰來管?

很多平台會說他們幫你管庫存,但實際上可能是你叫的料,他直接寄到工地。工地如果沒地方堆,或管理混亂,遺失、損壞的成本都是自己的。更糟的是,為了湊到平台的「免運門檻」或「量價折扣」,一次叫太多,結果案子結束還剩一堆呆料。所以,要先評估自己的倉儲能力和工地的管理水平,再去談合作模式。

混亂的工地材料堆放區
混亂的工地材料堆放區

2. 付款條件,才是現金流的命脈

對中小企業來說,現金為王。一站式採購如果要求「線上刷卡」或「立即付現」,那對現金流的壓力其實很大。 傳統跟熟識的材料行叫料,好處就是可以談票期,例如月結30天或45天。這點很重要。

所以在選擇一站式平台或供應商時,要優先問他們的付款彈性。能不能提供信用額度?票期怎麼算?這比單純比價一兩個產品的價錢更關鍵。不然,為了省幾百塊的料錢,結果卡住幾十萬的現金,得不償失。

3. 時間成本,要算「總帳」

採購的時間成本,不只是打電話、比價。還包括:

  • 溝通成本:跟一個窗口溝通,看似省時。但如果這個窗口不專業,一問三不知,還要回頭去問原廠,那還不如自己直接找專業廠商。
  • 處理錯誤的成本:送錯料、規格不對、延遲到貨...這些問題,單一窗口如果處理效率差,會嚴重拖累工地進度。
  • 交通與等待成本:採購人員跑好幾個地方,或者在一個地方等倉庫備料,都是時間。

所以,評估一站式採購省不省時,要把這些隱形成本都算進去。 找一個「專業的」單一窗口,遠比找一個「便宜的」單一窗口重要。

採購人員在電腦前使用整合平台
採購人員在電腦前使用整合平台

國外跟台灣的模式差異

研究了一下,國外的模式跟台灣很不一樣。像美國的Home Depot或Lowe's,他們有所謂的「Pro Desk」,專門服務專業承包商。 他們的優勢是店大、貨品種類多,而且提供商業信用卡和批量採購折扣。 採購就像去大賣場,一次買齊。但缺點是,專業深度可能不夠,而且價格不見得最便宜。有時候,跟特定領域的專業供應商買,服務和技術支援會更好。

這點跟台灣的情況很不一樣。台灣的市場比較小,傳統上是靠各地區、各專業領域的材料行網絡。 這些老闆可能自己就是技術底的,很懂料。雖然要跑好幾家,但可以得到比較專業的建議。現在台灣也開始有整合平台,但很多還在起步階段,比較像是把傳統材料行的目錄搬到網路上。 付款方式也大多要求先付,對中小企業的現金流幫助有限。

一個簡單的比較

把傳統模式和理想的一站式模式做個對比,可能會更清楚。

項目 傳統分散採購 理想的一站式採購
詢價比價 要打好幾通電話,很花時間。但可以找到最便宜的,或是跟熟悉的廠商拿到「人情價」。 平台上一目瞭然。不過,價格是不是真的最低?不一定,平台也要抽成。
庫存管理 自己憑經驗叫料,容易叫多或叫少。倉庫就是自家小貨車或工地角落。 理想上平台能提供庫存建議。但如果系統不準,或跟工地現場脫節,反而更亂。
付款條件 跟熟的廠商可以談月結,有彈性。 但要管好幾家的帳,很煩。 通常是統一結帳,帳務單純。但很多平台要求線上先付款,對現金流是個考驗。
採購時間 採購人員要像蜜蜂一樣,東市買駿馬、西市買鞍韉。心很累。 一個窗口搞定,理論上省時。但如果窗口不專業,或平台缺貨,反而更浪費時間在溝通上。
風險 分散風險,A家沒貨找B家。但品質、交期可能不穩定。 風險集中。如果這個平台或供應商出問題,整個案子可能停擺。 價格也容易被綁死。

風險與應變

所以,完全依賴單一供應商,風險很高。就像把所有雞蛋放在同一個籃子裡。 如果供應商倒閉、漲價、或者因為天災人禍無法出貨,工地就只能停工。

比較好的做法,是「80/20法則」。把八成的常用、標準化材料,交給一家可靠的一站式供應商,換取管理上的便利和可能的價格優勢。另外保留兩成的預算和採購彈性,用來應付緊急需求、特殊規格品,或是在地的、有特殊人情關係的供應商。這樣既能提升效率,又保有彈性,不會被綁死。

整齊的工地材料配送區
整齊的工地材料配送區

結論...算是吧

總之,一站式採購不是萬靈丹。它是一種工具。用得好,可以省下採購人員的精力,讓他們去做更重要的事。但前提是,必須找到一個真正懂工程、願意提供彈性付款條件、並且庫存管理能力強的「夥伴」,而不只是一個「平台」或「供應商」。對中小工程行來說,找到對的夥伴,比導入最新的系統更重要。

最後,我想問一個問題:如果你是小型工程行的老闆,你最看重的是「最低的材料價格」,還是「可以月結45天的付款條件」?可以在下面留言分享你的看法。

🎁 解鎖本篇限定Google外掛

別怕!水電材料採購懶人整合表——庫存、付款條件、時間成本一把抓

做過工程現場或幫忙管採購的朋友一定懂,每天材料進進出出,付款條件還五花八門,採購人員還常常被叫去對庫存,時間都在碎裂的 Excel、LINE、電話中流掉。我之前幫朋友協助場務,就碰過現場找不到最新庫存、老闆急問還要翻半天的窘境。有時表單填完還要自己算付款日或比價,超費時!這個工具,就是來幫大家省事,讓你用 Google 表單,一次搞定材料採購、庫存整合、付款狀態,還幫你記錄每次操作所花時間,採購人員超有感!

這段程式碼直接複製就能用!

只要填寫材料資料、庫存變動、付款方式和工作時間,表單自動整理統計,省去來回比對的時間。


// === 水電材料採購整合工具 ===

function doGet(e) {
  var html = [];
  html.push('<div style="max-width:550px;margin:30px auto;padding:20px;'
    + 'background:#f4f8fc;border-radius:12px;">');
  html.push('<h2 style="color:#2367a0;">材料採購&庫存一站式填報</h2>');
  html.push('<form id="matForm">');
  // 材料名稱
  html.push('<label>材料名稱:<input type="text" name="matName" required></label><br>');
  // 單位
  html.push('<label>單位:<input type="text" name="unit" style="width:50px;"></label><br>');
  // 數量(正可為採購,負為領用)
  html.push('<label>數量(進為+,領出為-)<input type="number"'
    + 'name="qty" required></label><br>');
  // 單價
  html.push('<label>單價(元):<input type="number" name="price" min="0" step="1"></label><br>');
  // 供應商
  html.push('<label>供應商:<input type="text" name="supplier"></label><br>');
  // 付款條件
  html.push('<label>付款條件:<select name="payTerm">'
    + '<option value="現金">現金</option>'
    + '<option value="月結30天">月結30天</option>'
    + '<option value="票期60天">票期60天</option>'
    + '<option value="其他">其他</option>'
    + '</select></label><br>');
  // 預計付款日自動顯示
  html.push('<label>採購日期:<input type="date" name="buyDate" required></label><br>');
  // 採購人
  html.push('<label>採購人:<input type="text" name="buyer"></label><br>');
  // 處理時間(分鐘)
  html.push('<label>這次花了幾分鐘填單?<input type="number" name="min" min="1" required></label><br>');
  // 備註
  html.push('<label>備註:<input type="text" name="note" style="width:300px;"></label><br>');
  html.push('<button type="submit">提交/新增</button>');
  html.push('</form>');
  // 統計庫存+付款狀態
  html.push('<hr><div id="stat"><em>載入庫存中...</em></div>');
  // refresh btn
  html.push('<button onclick="window.location.reload()" '
    + 'style="margin-top:12px;">手動更新</button>');
  html.push('<script>'
    + 'document.getElementById("matForm").onsubmit=function(e){'
    + 'e.preventDefault();var f=new FormData(this),o={};'
    + 'for(var [k,v]of f.entries())o[k]=v;'
    + 'fetch("?submit=1",{method:"POST",body:JSON.stringify(o)})'
    + '.then(x=>x.text()).then(()=>{alert("已新增!");window.location.reload()});};'
    + 'fetch("?show=1").then(x=>x.json()).then(function(arr){'
    + 'var tb="<table border=1 cellpadding=4><tr>'
    + "<th>材料</th><th>庫存</th><th>未付金額</th><th>最早付款日</th></tr>";'
    + 'arr.forEach(function(row){tb+="<tr><td>"+row[0]'
    + '"+</td><td>"+row[1]+"</td><td>"+row[2]'
    + '"+</td><td>"+row[3]+"</td></tr>";});'
    + 'tb+="</table>";document.getElementById("stat").innerHTML=tb;});'
    + '</script>');
  html.push('</div>');
  return HtmlService.createHtmlOutput(html.join(""));
}

function doPost(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('採購資料')||ss.insertSheet('採購資料');
  var data = JSON.parse(e.postData.contents);
  var keys = ["材料名稱","單位","數量","單價","供應商",
    "付款條件","採購日期","採購人","花費分鐘","備註"];
  // 如果首列不存在就補上
  if (sh.getLastRow()==0) sh.appendRow(keys);
  var row = [data.matName||"", data.unit||"", Number(data.qty)||0, Number(data.price)||0, 
    data.supplier||"", data.payTerm||"", data.buyDate||"", data.buyer||"", Number(data.min)||0, data.note||""];
  sh.appendRow(row);
  return ContentService.createTextOutput('ok');
}

function doGetShow_() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('採購資料');
  if (!sh) return ContentService.createTextOutput(JSON.stringify([]));
  var dat = sh.getDataRange().getValues();
  if (dat.length<2) return ContentService.createTextOutput(JSON.stringify([]));
  var inv = {}; // 材料對應 {庫存,未付,最早付款日}
  for (var i=1;i<dat.length;i++) {
    var r = dat[i], mat = r[0], qty = Number(r[2])||0, amt = Number(r[3])||0, pay=r[5], dt=r[6];
    if (!inv[mat]) inv[mat]=[0,0,null];
    inv[mat][0] += qty;
    // 假設領用就不算付款(只+採購且付款條件非現金)
    if (qty>0 && pay!="現金") {
      inv[mat][1] += amt*qty;
      // 算付款日
      var pd = new Date(dt);
      if (pay.indexOf("30")>-1) pd.setDate(pd.getDate()+30);
      else if (pay.indexOf("60")>-1) pd.setDate(pd.getDate()+60);
      // 取最早付款日
      var dstr = pd.toISOString().slice(0,10);
      if (!inv[mat][2]||dstr<inv[mat][2]) inv[mat][2]=dstr;
    }
  }
  // 輸出格式 [[材料,庫存,未付金額,最早付款日],...]
  var res = [];
  for (var k in inv) res.push([k, inv[k][0], inv[k][1], inv[k][2]||"-"]);
  return ContentService.createTextOutput(JSON.stringify(res));
}

// 讓?show=1抓統計
function doGet(e){
  if (e && e.parameter && e.parameter.show=="1") return doGetShow_();
  return doGet_main();
}
function doGet_main(){ return doGet(); }
// END

超簡單!六步驟搞定部署

放心跟著來,一步步超穩!

  1. 打開 Apps Script 編輯器
    先開啟 Google 試算表,然後在最上方選單找到「擴充功能」→「Apps Script」點下去。通常「擴充功能」在畫面中間偏右的位置。
    這時會跳出新分頁,就是 Apps Script 的編輯器啦。
    ⚠️ 我自己公司帳號有時候沒權限進,這種要用自己私人帳號比較快,不然就請 IT 幫忙開權限。
  2. 全部清空貼上程式碼
    看到編輯器中間那片大白,按 Ctrl+A 選全部,再按 Delete 刪掉。接著複製上面的程式碼(記得全選,不然容易漏),Ctrl+V 貼進去。
    這樣「function myFunction()」就會消失,變成一大串新內容。
    ⚠️ 很多人只貼了一半,結果執行錯誤,建議貼好前後都檢查一下!
  3. 存檔專案
    點左上角那個藍色磁碟片圖示(或直接 Ctrl+S),第一次存會跳出「請命名專案」,隨便取個名字即可。
    存完檔右邊應該會閃一下,表示寫入成功。
    ⚠️ 我之前常常一忙忘存,直接去部署,結果沒反應,要重來一次才會好,超阿雜。
  4. 部署成網頁應用程式
    看右上角,點「部署」藍色按鈕,選「新增部署作業」,接著會跳出設定小視窗:
    1. 點左下齒輪選「網頁應用程式」
    2. 執行身分選「我」
    3. 誰可以存取選「任何人」
    4. 點「部署」
    這樣流程走完就快好了。
    ⚠️ 記得「誰可以存取」一定要選「任何人」,不然現場同事用不到會一直反映。
  5. 授權警告一條龍
    會看到紅色警告頁,先別怕,這只是 Google 提醒你還沒驗證(自己寫的都這樣)。
    點「進階」→「前往(不安全)」→「允許」。
    完成後會自動回來 Apps Script 畫面。
    ⚠️ 第一次用 Apps Script 幾乎都會卡這裡。我在論壇看超多人問,其實就是權限提醒,不是什麼病毒,放心按「允許」沒事的!
  6. 拿網址直接用,想改要重新部署
    成功授權後,系統會出現一串網址(https://script.google.com/...),複製下來,丟瀏覽器打開,就會看到剛剛的採購填報工具啦。
    ⚠️ 記得,每次有改程式碼都要重新部署一次,否則打開還是舊的喔!我一開始就被這個小陷阱搞得找不到原因。
⚠️ 關於紅色授權警告不用怕
這個紅色授權畫面常常嚇到新手,其實只要是自己寫的 Apps Script、還沒經過 Google 官方審核,都會跳這個畫面。它只是標準安全機制,提醒你這程式有權限動用 Google 文件,不代表危險。如果你是自己貼上/自己寫的,點「進階」→「允許」就對了。我有問過做 IT 朋友,大家都說只要來源確定沒問題,這步驟是必經的,不用擔心資料外洩!

這工具能怎麼用?來兩個真實例子!

1. 阿明是工地主任,平常每天都要對倉庫的庫存,還要定期匯報材料採購金額、未付金額。用這工具,他每天用手機記錄材料進出,下班時一點按鈕,統計表自動更新,省掉手算和反覆確認的時間。

2. 小美是採購人員,常被老闆臨時問「最近買的電線還剩幾捲?有哪幾筆還沒付款?」。以前要翻 Excel 找記錄,現在直接打開工具,查一查材料名馬上知道庫存和未付金額,還能說出下次付款日。連花了多少時間處理,她都能記錄給老闆看——從此工作有據可依,再也不怕臨時追問啦!

Related to this topic:

Comments

  1. profile
    Guest 2026-01-10 Reply
    之前跟著學長弄過一個小型水電案子,現在想起來還有點累。那時候材料自己找 - 超麻煩,真的。每次得跑好多間店,哪一家缺這個、哪一家沒有那個,很花時間,而且都在問價錢,比價格,有時候真的會覺得心好累。付款也是問題,有些地方一定要現金,我口袋根本沒帶那麼多,有的店又可以月結,但講條件麻煩,一下學生身份又不好意思太兇。 後來才知道其實現在有很多廠商搞什麼一站式採購,上網填單,大部分常用的東西幾乎隔天就到,這真的是方便蠻多,不用怕零件湊不齊,也少掉東奔西跑那種無力感。不過也不是完全沒問題啦,如果遇到比較奇怪或冷門的材料,其實還是要自己找,只是至少日常要用的那些基本款能直接買很省事,推薦啦,就如果你也懶得一直比價、跑腿的話。
  2. profile
    Guest 2025-10-24 Reply
    講真的,身為家長,之前家裡裝修那時候我就試過那種水電材料「一站式」採購。結果是什麼?到現場還是有東西漏掉、清單怎麼看都覺得哪裡不齊。說這樣辦比較有效率…嗯,我也半信半疑啦。有的時候付錢也沒有想像中簡單,流程多一步少一步常常卡住。總覺得很麻煩,不確定是不是我的問題還是整個流程本來就有點怪,其實我現在也搞不清楚重點到底在哪。