- 省時
對帳表從客戶主檔取 5 個欄位,選單按一下才更新
對帳只需要客戶主檔的 5 個欄位。在對帳表的選單按一下,才把這 5 欄複製過來;目前仍在試行。
背景與使用技術(3 項)
對帳只用得到客戶主檔 5 個欄位,手動複製會忘記,整張主檔跨檔案匯入又牽連太廣。所以寫了一支 Apps Script(寫在試算表裡的小程式):在對帳表的選單按一下,只取這 5 欄、整段覆蓋寫進對帳分頁。不排程,目前仍在試行。
誰在用
做金流對帳、需要客戶主檔 5 個欄位的人
原本怎麼做
金流對帳只用到客戶主檔的 5 個欄位,但主檔是為了其他用途持續維護的大表。要把那 5 欄放進對帳表只有兩條路:主檔一改就手動複製,一定會忘;或接一條跨檔案匯入,為了 5 欄把整張主檔連過來,依賴範圍和 5 欄不成比例。
前後對比
量測:實測=有計時或有紀錄;估計=喜特先生推估;客戶自述=客戶回報;規格=設計上的固定條件;待補=尚未取得數字。
流程一眼看懂
客戶主檔
手動複製 5 欄
貼到對帳表
對帳表選單「同步」
讀來源主檔指定分頁
每列只留 5 欄
整段重寫對帳分頁
流程示意:依本案既有做法整理,非客戶實際畫面。
做了什麼
- 只拿 5 欄,不連整張主檔,依賴範圍和需求成比例。
- 按下去才執行:何時更新由人決定,不排程。
- 來源分頁名稱對不上就直接報錯,不猜。
- 已知限制:來源列數變少時對帳分頁尾端會留舊資料;來源欄位位置一動就可能默默寫錯。所以目前仍在試行。
程式碼與實作細節收在頁面下方,需要時再展開。
你的情況像這樣嗎?
- 你只用到另一張大表裡的幾個欄位,卻要靠手動複製或整張連過來。
- 資料不是天天在變,你想自己決定何時更新。
- 你願意先試行、邊用邊確認來源結構穩不穩。
更多成果與運作條件
選單按一下取代手動複製
依固定順序帶入對帳需要的 5 個欄位
由人決定何時更新
沒有排程,只有人點選單才會更新
整段覆蓋,不比對差異
來源列數變少時,對帳分頁尾端會留著舊資料,見下方限制
以上為本案既有成果與運作條件;估計值依原始資料標示,其他專案需另行評估,並非通用成效保證。
同步時要防止的殘留資料
來源筆數變少時,仍須檢查目的表是否留著舊列;本案目前仍在試行。
畫面示意・範例資料,非客戶實際截圖。手機可左右滑動查看。
挑戰:原本遇到的困難
對帳只用到客戶主檔的 5 個欄位,但主檔是為了其他用途持續維護的大表,欄位與範圍都遠超過對帳需要。要把那 5 欄放進對帳表,原本只有兩條路,都不理想:
- 手動複製:主檔改過之後,要靠自己想起來重貼,沒有任何東西提醒,對帳表就悄悄變舊
- 跨檔案即時匯入:為了 5 欄把整張主檔連過來,主檔的分頁名稱、權限或結構一改,對帳表跟著受影響,依賴的範圍比 5 欄大得多
- 對帳資料不是天天在變:不需要隨時更新,需要的是自己決定什麼時候更新
完整解決方案與設計取捨
在對帳試算表上加一個「同步」選單。按下去,才會讀取來源主檔的指定分頁,每列只留 5 欄,整段覆蓋寫進對帳分頁。
核心設計
- 只取 5 欄:依固定順序輸出,不鏡射整張主檔,依賴範圍和需求成比例
- 按下去才執行:沒有排程,何時更新由人決定
- 整段覆蓋:先清空這次要寫的範圍再重寫,不做增量比對
- 對不上就停:來源分頁名稱找不到,直接報錯,不猜一個最接近的分頁
這支工具仍在試行。欄位是依位置讀取,來源欄位一動就可能默默寫錯,這是目前最需要盯的地方,詳見下方「限制」。
技術與實作細節
展開完整實作說明
運作方式
按下「同步」選單後,依序做四件事:
- 授權。 選單是自訂的,第一次執行會跳出 Google 的授權提示。
- 讀來源、只留 5 欄。 讀取來源主檔的指定分頁,每一列只留下下表的 5 個欄位。欄位是依位置讀的,不是依標題名稱比對。某列比要取的欄位還短時,缺的欄補空字串,避免寫入失敗。
- 整段覆蓋對帳分頁。 對帳分頁不存在就自動建立。寫入範圍先清空,再整段寫入新資料,不與舊內容比對。
- 來源對不上就停。 來源分頁名稱找不到,直接丟出錯誤。
| 對帳分頁位置 | 來源欄位 | 內容 |
|---|---|---|
| A | A | 公司代號 |
| B | B | 公司名稱 |
| C | Q | 對帳用欄位 |
| D | P | 對帳用欄位 |
| E | AE | 對帳用欄位 |
輸出順序是寫死的常數。來源裡 P 在 Q 前面,對帳分頁卻要 Q 在 P 前面,程式照常數輸出,不看來源怎麼排。下面是核心的十行(簡化示意,來源試算表 ID 與分頁名稱等三個常數省略):
const OUT_COLS = [0, 1, 16, 15, 30]; // A、B、Q、P、AE(0 起算)
function syncCustomerList() {
const src = SpreadsheetApp.openById(SRC_ID).getSheetByName(SRC_TAB);
if (!src) throw new Error('找不到來源分頁:' + SRC_TAB);
const out = src.getDataRange().getValues().map(r => OUT_COLS.map(c => r[c] ?? ''));
const ss = SpreadsheetApp.getActiveSpreadsheet();
const dst = ss.getSheetByName(DST_TAB) || ss.insertSheet(DST_TAB);
const range = dst.getRange(1, 1, out.length, OUT_COLS.length);
range.clearContent().setValues(out);
}為什麼不用手動複製或即時匯入
手動複製的問題不只是慢,是會忘。主檔改了,對帳表還是舊的,而對帳就是拿這張表去算。
即時匯入看起來一勞永逸,但要用 IMPORTRANGE(Google 試算表跨檔案即時匯入資料的函式)把整張主檔連過來,只為了 5 欄。來源主檔的分頁名稱、權限或結構任何一項改變,對帳表都會跟著受影響。
限制
來源列數變少時,對帳分頁尾端會留舊資料
假設上次同步時來源有 5 列,這次只剩 3 列。同步清空的是這次要寫入的 3 列範圍,所以對帳分頁第 4、5 列的舊資料沒有被清掉,停在新資料後面。表面上它仍是一張完整的表。
圖:示意。來源縮成三列後同步一次,對帳分頁第四、五列是上次留下的舊資料,同步不會清掉它們。
後果是對帳分頁最後幾列過期,而且沒有任何錯誤訊息。拿這張表對帳的人要知道這件事:先比對主檔的列數,再看對帳分頁的最後一列。如果主檔列數經常縮小,或對帳不能接受過期列,就要把清空範圍改成整個分頁,不只是改成排程。
原本的假設是「更新就是覆蓋」,沒有想到覆蓋的範圍由新資料的大小決定。來源列數變少時,舊資料就落在這次清空的範圍之外。
欄位靠位置讀,來源改了不會報錯
欄位是按位置讀的,好處是常數只有 5 個數字,不需要多一道查找。代價是來源插入或刪除一欄時,同步不會報錯,只會默默把錯的資料寫進同樣的 5 個輸出欄位。目前唯一的處理方式,是有人發現後手動改常數。
失敗沒有通知
這支腳本沒有接上共用的失敗通知。來源連不上、分頁被改名,唯一的痕跡是 Apps Script 的執行紀錄,沒有人會收到通知,要自己去翻。
成立的前提,與何時該改成排程
這支工具成立的前提有三個,目前沒有任何東西在外部強制檢查:執行者要有來源試算表的讀取權限、來源分頁名稱維持不變、有人會記得點選單。
三個前提任何一個不成立,失效的方式都不一樣。權限不足和分頁改名會直接報錯;沒人點選單則什麼都不會報,對帳分頁只是安靜地過期。
如果對帳改成需要每週或每次都是最新的資料,或是「記得點選單」這件事已經靠不住,就該改成排程,並接上失敗通知,不能再只靠人去點。
目前狀態
對帳分頁上的 5 欄現在直接從來源主檔取得,不用再手動複製。這支工具仍在試行,還沒被收進內部的工具目錄。欄位依位置讀取這件事,目前只能靠發現問題後再改常數來處理。