
在管理專案進度或待辦清單時,我們常希望「填入日期」後,該列資料能自動移到「已完成」的頁籤,保持畫面清爽。雖然內建公式可以做到資料同步,但要達成「搬移」且「保留格式」,就需要動用 Google Apps Script。
以下分享一套 優化版腳本,支援雙向搬移,且能完美保留原本的背景顏色、文字格式與日期顯示方式。
第一步:開啟指令碼編輯器- 在你的 Google 試算表中,點擊上方選單的「擴充功能」>「Apps Script」。
- 進入編輯器後,刪除原本的所有預設內容。
第二步:貼上自動化腳本
將下方代碼完整複製並貼入編輯器中。這段代碼採用 copyTo 邏輯,確保格式不會在搬移過程中跑掉。
/**
* 自動雙向搬移資料列(V2 防呆版:自動新增列)
*/
function onEdit(e) {
const ss = e.source;
const range = e.range;
const sheet = range.getSheet();
const sheetName = sheet.getName();
const row = range.getRow();
const col = range.getColumn();
const value = range.getValue();
// --- 設定區域 ---
const MAIN_SHEET = "原始資料";
const TARGET_SHEET = "已完成";
const DATE_COL = 2;
// ----------------
if (row <= 1) return;
if (sheetName === MAIN_SHEET && col === DATE_COL && value instanceof Date) {
moveRowWithFormat(sheet, TARGET_SHEET, row);
}
else if (sheetName === TARGET_SHEET && col === DATE_COL && value === "") {
moveRowWithFormat(sheet, MAIN_SHEET, row);
}
}
/**
* 帶格式搬移的核心函式(含自動增列功能)
*/
function moveRowWithFormat(sourceSheet, destSheetName, row) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const destSheet = ss.getSheetByName(destSheetName);
const lastCol = sourceSheet.getLastColumn();
const sourceRange = sourceSheet.getRange(row, 1, 1, lastCol);
// --- V2 新增:檢查目標分頁是否有空間 ---
const destLastRow = destSheet.getLastRow(); // 目前最後一筆資料
const destMaxRows = destSheet.getMaxRows(); // 目前網格總列數
// 如果資料已填滿,自動新增一列
if (destLastRow >= destMaxRows) {
destSheet.insertRowAfter(destMaxRows);
}
// ------------------------------------
const destRow = destLastRow + 1;
const destRange = destSheet.getRange(destRow, 1, 1, lastCol);
sourceRange.copyTo(destRange);
sourceSheet.deleteRow(row);
}
第三步:關鍵的觸發與授權設定
貼上代碼後,若沒有進行以下動作,腳本將無法運作:
- 存檔與命名:點擊上方的「儲存」圖示(磁碟片),並為專案取個名字。
- 手動授權:
- 在編輯器上方的下拉選單選取 onEdit。
- 點擊「執行」按鈕。此時會跳出「需要授權」視窗,請點選「查看權限」。
- 選擇你的 Google 帳號,看到「Google 尚未驗證此應用程式」時,點選左下角 「進階」。
- 點選最下方的 「前往(你的專案名稱)(不安全)」,最後按下 「允許」。
- 注意:執行後若報錯為正常現象,因為手動執行時缺少編輯事件的參數,只要完成授權流程即可。
運作原理與注意事項
- 觸發機制:此腳本使用
onEdit簡單觸發器。當你「親手編輯」指定欄位時就會觸發。 - 格式完美同步:使用
copyTo代替傳統的appendRow,能將儲存格的背景色、字體大小、日期顯示格式(例如 YYYY/MM/DD)一併帶到新分頁。 - 雙向搬移:不僅填入日期會移走,如果你在「已完成」分頁反悔了,只要將日期欄位內容清空(Delete),該列就會自動飛回「原始資料」分頁。
- 工作表名稱:請務必確保程式碼中的
MAIN_SHEET名稱與試算表下方的標籤名稱完全一致
💡 進階優化:避免「資料列不足」導致報錯
在使用上述腳本一段時間後,你可能會遇到一個小問題:當「已完成」分頁的表格被填滿(到達 Google Sheet 預設的列數上限)時,程式會因為找不到下一列而報錯。
為了讓工具更耐用,我們可以加入一段「防呆機制」。若目標分頁沒有空間了,程式會自動新增一列空白列。
透過這個自動化小技巧,你可以輕鬆打造出如 App 般順滑的任務管理系統。若想了解更多進階用法,歡迎參考 Google Apps Script 官方開發文件。



















