Google 試算表:建立新表到 create() 自動化

 


如果你常在開 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);在文件設定統一時區


延伸閱讀推薦:

張貼留言 (0)
較新的 較舊