如果你常在開 Google 試算表,大概對那幾個步驟很熟:按「新增」、改名字、搬到正確資料夾、設欄位格式、再把同事拉進來。
麻煩的是,每次都要重來一遍,還常被時區、日期、權限這些小東西絆腳。
本篇文章盡可能將內容說清楚、做簡單:先用最直覺的方法把第一份表穩穩生出來,再用 Apps Script 的 SpreadsheetApp.create() 把「建立→初始化→搬移→加權限」整串自動化。
文中給你能直接貼上的程式碼、一步步操作,以及容易踩雷的清單(共享雲端硬碟權限、配額與逾時、日期跑偏等),希望本篇文章能幫助到你。
目錄
{tocify} $title={目錄}
什麼是 Google 試算表與適用情境
雲端試算工具,重點是「多人即時協作、權限細緻、版本記錄、跨裝置」。
適合:KPI 月報、專案追蹤、表單回收資料整理、跨部門共享數據、臨時資料湖。
不適合:龐大樞紐資料庫、超大資料量(百萬列級別)或需嚴謹交易/鎖定的情境。
四種「建立試算表」的方法
A. 介面直接建立(最直觀)
1. 進入 [sheets.google.com] 或雲端硬碟 → 新增 → Google 試算表。
2. 立刻重新命名、移動到正確資料夾(避免散落)、設定共用。
B. 用範本(官方或自製)
1. 好處:一致的欄位、格式、圖表樣式,減少重工。
2. 做法:把常用報表存作範本檔,之後複製使用;或用 Script 自動複製模板檔。
C. 匯入現有檔案
1. Excel/CSV 轉入:雲端硬碟上傳後以試算表開啟;或在試算表中 檔案 → 匯入。
2. 注意:文字編碼、日期格式、千分位與小數點、欄寬常需二次整理。
D. 用 Apps Script 自動建立(本文重點)
適合批次產生(例:每月自動開新檔、每位業務一份客戶名單、每個專案一份 KPI 表)。
SpreadsheetApp.create() 全面解析
基本語法
// 建立一個名為「月報-2025-10」的新試算表
const ss = SpreadsheetApp.create('月報-2025-10');
Logger.log(ss.getId());
Logger.log(ss.getUrl());
create(name):只指定名稱。
create(name, rows, columns):同時指定預設工作表的列數、欄數。
const ss = SpreadsheetApp.create('名單空白表', 1000, 20);
回傳物件 Spreadsheet
建立後立即取得一個 Spreadsheet 物件,可:
getId() : 取得檔案 ID(用於後續搬移/權限)。
getUrl() : 取得網址(發通知用)。
getActiveSheet() / getSheetByName() : 操作工作表。
小提醒:新建立的檔案預設會在你的「我的雲端硬碟」根目錄。若有專用資料夾,記得搬家(見下一節)。
建立後必做:命名、資料夾、語系/時區、欄位、權限
A. 重新命名與標準命名規則
建議格式:{部門}-{用途}-{YYYYMM} 或 {專案}-{用途}-{版本}。
範例:FIN-收支月報-202510、CRM-客戶名單-北區-2025Q4。
B. 移動到指定資料夾(避免散落)
function moveToFolderById(fileId, folderId) {
const file = DriveApp.getFileById(fileId);
const folder = DriveApp.getFolderById(folderId);
file.moveTo(folder); // 直接搬移
}
為了權限一致,盡量先把檔案搬到正確的資料夾,再設定共用規則。
C. 語系/時區/地區格式
ss.setSpreadsheetLocale('zh_TW');
ss.setSpreadsheetTheme(SpreadsheetApp.newSpreadsheetTheme().build());
// 時區在「檔案 → 設定」可人工調;Script 端常改由模板繼承
時區錯誤會讓日期、NOW()/TODAY() 以及時間戳記偏差。
D. 預設欄位與頁籤命名
const sh = ss.getActiveSheet().setName('原始資料');
sh.getRange(1,1,1,6).setValues([
['日期','客戶','品項','數量','單價','小計']
]);
sh.getRange('A1:F1').setFontWeight('bold').setWrap(false);
E. 權限與共用(先資料夾,後檔案)
盡量靠「資料夾」控權限,讓新檔案繼承。
個資/敏感欄位可用保護範圍(下一節)。
進階自動化:標頭、格式、保護、共用與初始資料
function bootstrapReport(title, folderId, editors) {
const ss = SpreadsheetApp.create(title, 1000, 20);
// 移動到指定資料夾
DriveApp.getFileById(ss.getId()).moveTo(DriveApp.getFolderById(folderId));
// Sheet 結構
const raw = ss.getActiveSheet().setName('原始資料');
const meta = ss.insertSheet('維護');
raw.getRange(1,1,1,8).setValues([[
'日期','部門','負責人','客戶','品項','數量','單價','小計'
]]).setFontWeight('bold');
raw.getRange('H2').setFormula('=E2*F2');
// 基本格式
raw.getRange('A:A').setNumberFormat('yyyy-mm-dd');
raw.getRange('F:F').setNumberFormat('#,##0');
raw.getRange('G:H').setNumberFormat('#,##0.00');
// 保護(鎖欄)
const p = raw.getRange('A1:H1').protect();
p.setDescription('鎖定標頭');
p.removeEditors(p.getEditors());
// 權限(加編輯者)
editors.forEach(mail => ss.addEditor(mail));
return ss.getUrl();
}
TIP:初始化時一次把欄位、格式、保護、權限都設定好,能省下大量手動維護成本。
共用與權限模型:個人硬碟 vs. 共享雲端硬碟
1. 個人我的雲端硬碟:檔案屬於建立者;搬到資料夾後,繼承資料夾權限。
2. 共享雲端硬碟:檔案屬於團隊;moveTo() 需有該共享雲端硬碟的「內容管理者」以上權限,否則會丟例外。
建議:
先建立在個人硬碟,再搬移到共享雲端硬碟測試權限;或直接用模板已在共享雲端硬碟建立。
配額與限制(量產前必讀)
Apps Script 單次執行時間上限(常見為 6 分鐘);大量建檔請分批或用排程分段跑。
每日配額:
讀寫、建立檔案、寄信、觸發器總執行量等都有上限;量大時須做節流與重試。
節流建議:
1. 批次處理:把多個 setValue 合併成一次 setValues;格式一次性套用區域。
2. 加入 sleep/backoff:遇到 Service invoked too many times 時,退避 2^n 秒再重試。
3. 利用時間驅動觸發器(每 5~15 分鐘)分段建立,降低單次壓力。
常見錯誤與雷點(含排錯建議)
| 症狀/訊息 | 典型成因 | 快速排查與修法 |
|---|---|---|
Service invoked too many times |
建檔/寫入過於頻繁,打到配額 | 加入退避重試;分批;避開整點; 減少 API 呼叫次數 |
Exception: You do not have permission |
權限不足(尤其搬往共享雲端硬碟) |
確認對目標共享雲端硬碟有「內容管理者」; 或改放到個人資料夾後由管理者搬 |
| 建立成功但找不到檔案 | 建在根目錄沒搬移、或搬到你無權限的空間 |
立即 Log getUrl() 與
getId();把搬移失敗也記錄並重試 |
| 日期/金額格式怪 | 語系或時區不一致 |
統一 zh_TW 與時區;模板化設定;用 TEXT() 明確格式化
|
| 標頭/驗證規則被改壞 | 權限太鬆、未設保護 | 鎖標頭列; 把維護設定放到獨立工作表並保護 |
| 每月自動建檔偶爾漏跑 | 觸發器尖峰或短暫失敗 | 觸發器多設幾個分流時點; 腳本內部加重試與錯誤通知 |
| 跨時區同事看到不同日期 | 使用者個人設定不同 |
用固定時區格式化(Utilities.formatDate);在文件設定統一時區
|
延伸閱讀推薦:
Google 試算表:工作表重新命名與 rename() 功能
Google 試算表:拿到正在操作的試算表 getActiveSpreadsheet()
Google 試算表:用檔案 ID 開啟試算表 openById()
Google 試算表:取得顯示的工作表getActiveSheet()
Google 試算表:藉由名稱取得工作表getSheetByName()
Google 試算表:取得所有工作表 getSheets()
Google 試算表:取得工作表數量 getNumSheets()
Google 試算表:焦點切到指定工作表 setActiveSheet()
Google 試算表:刪除工作表 deleteSheet()
