Automation
Google Workspace+GAS 自動化零基礎入門
用 Google Apps Script 把 Gmail、雲端硬碟、表單、試算表串成自動流程。賴家榮零基礎入門:看懂工具、拆解流程、做出第一個自動化。附完整簡報下載。
閱讀知識
你會做出一套自動歸檔系統:使用者填完 Google 表單送出後,Gemini 自動判斷這筆回覆屬於哪一類,Apps Script 就在雲端硬碟建立對應資料夾,並把內容存成 Google 文件歸檔,完全不用人工分類。
這套流程特別適合客服單、報名表、意見回饋這種每天都會進來、又需要分類存檔的場景。學會之後,你可以把「收件、判斷、建資料夾、存檔」這串重複動作,完全交給 Google 的伺服器自動幫你跑。
想像你經營一個小工作室,官網放了一張 Google 表單讓客戶提出需求。有人問報價、有人要技術支援、有人只是想合作洽談。過去你得每天打開試算表,一筆一筆看內容,判斷這是哪一類,再手動把它拖進雲端硬碟對應的資料夾。件數一多,不但花時間,還常常分錯或忘記歸檔。
有了 GAS 加上 Gemini,這件事可以完全自動化。表單一送出,程式立刻把回覆內容丟給 Gemini 判斷類別,接著自動在雲端硬碟找到(或建立)對應的資料夾,再把這筆回覆存成一份文件放進去。你早上打開雲端硬碟,所有東西都已經分門別類排好,只要處理內容本身就好,省下大量重複勞動。
動作在 Google 表單編輯畫面右上角點三個點選單,選「指令碼編輯器」,會開啟一個空白的 Apps Script 專案。
常見地雷要從「表單」本身進入,不要從試算表進入,這樣才能綁定表單提交事件。
動作左側點齒輪「專案設定」,捲到最下方「指令碼屬性」,新增一組屬性:名稱填 GEMINI_API_KEY,值貼上你的金鑰。
常見地雷金鑰前後不要有多餘空白,貼完記得按「儲存指令碼屬性」,否則程式讀不到。
動作在編輯區把預設的 myFunction 刪掉,貼上本文提供的 askGemini 函式,它負責呼叫 Gemini API 並回傳文字。
常見地雷網址中的模型名稱 gemini-2.5-flash 不要改錯,末尾 key 參數要保留。
動作接著貼上 onFormSubmit 主函式,它會取出回覆內容、請 Gemini 判斷類別、建立資料夾並存檔。
常見地雷函式參數 e 是事件物件,測試時不能直接手動執行,要透過觸發器或模擬事件。
動作在上方函式選單選 onFormSubmit,按「執行」,跳出授權視窗時選你的帳號,點「進階」再允許存取。
常見地雷會出現「Google 尚未驗證這個應用程式」警告,這是自己的專案屬正常,放心往下點允許。
動作左側點鬧鐘圖示「觸發條件」,右下角「新增觸發條件」,函式選 onFormSubmit,事件來源選「來自表單」,事件類型選「表單提交時」。
常見地雷事件來源一定要選「來自表單」,選錯成「時間驅動」就不會在送出時觸發。
動作打開表單填一筆真實內容送出,回到雲端硬碟檢查是否自動建立資料夾,並產生一份歸檔文件。
常見地雷若沒反應,先到 Apps Script 左側「執行項目」看紀錄,通常是金鑰或授權問題。
下面兩段程式碼是整套流程的核心。第一段 askGemini 是共用的 AI 呼叫函式,之後每一課都會用到,請原樣照抄;第二段 onFormSubmit 是本課的主流程,負責串起判斷、建資料夾與存檔。
function askGemini(prompt) {
const key = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
const url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=' + key;
const payload = { contents: [{ parts: [{ text: prompt }] }] };
const res = UrlFetchApp.fetch(url, { method:'post', contentType:'application/json', payload: JSON.stringify(payload), muteHttpExceptions:true });
return JSON.parse(res.getContentText()).candidates[0].content.parts[0].text.trim();
}
function onFormSubmit(e) {
// 1. 取出表單回覆的問答內容
const items = e.response.getItemResponses();
let content = '';
items.forEach(function(it) {
content += it.getItem().getTitle() + ':' + it.getResponse() + '\n';
});
// 2. 請 Gemini 判斷類別,限定只回傳一個詞
const prompt = '請閱讀以下表單回覆,判斷它屬於哪一類,只回覆下列其中一個詞,不要多餘說明:報價需求、技術支援、合作洽談、其他。\n\n' + content;
let category = askGemini(prompt);
const allow = ['報價需求','技術支援','合作洽談','其他'];
if (allow.indexOf(category) === -1) category = '其他';
// 3. 找到或建立歸檔總資料夾與類別子資料夾
const root = getOrCreateFolder(DriveApp.getRootFolder(), '表單歸檔');
const target = getOrCreateFolder(root, category);
// 4. 把這筆回覆存成一份 Google 文件
const title = category + '_' + Utilities.formatDate(new Date(), 'Asia/Taipei', 'yyyyMMdd_HHmmss');
const doc = DocumentApp.create(title);
doc.getBody().appendParagraph('類別:' + category);
doc.getBody().appendParagraph('送出時間:' + new Date());
doc.getBody().appendParagraph('----------');
doc.getBody().appendParagraph(content);
doc.saveAndClose();
// 5. 把文件搬進對應資料夾
const file = DriveApp.getFileById(doc.getId());
target.addFile(file);
DriveApp.getRootFolder().removeFile(file);
}
// 依名稱找資料夾,找不到就建立
function getOrCreateFolder(parent, name) {
const it = parent.getFoldersByName(name);
return it.hasNext() ? it.next() : parent.createFolder(name);
}
用文字描述就是:表單送出後觸發程式,程式先把所有問答整理成一段文字,交給 Gemini 判斷屬於哪一類;接著在雲端硬碟的「表單歸檔」總資料夾底下,找到或新建同名的類別子資料夾;最後把這筆回覆寫成一份 Google 文件,搬進該子資料夾,整個過程不需要任何人工操作。
到 ai.google.dev 用 Google 帳號登入,點「Get API key」建立一組金鑰,複製那串英數字即可,過程不用綁信用卡,免費額度就足夠測試與小量使用。拿到後貼到 Apps Script 的「專案設定」裡的「指令碼屬性」,名稱設 GEMINI_API_KEY,這樣程式就能安全讀取,不必把金鑰直接寫在程式碼中。
技術上可以,但很不安全。程式碼可能被分享、複製或不小心公開,金鑰一旦外洩,別人就能用你的額度甚至產生費用。放在 PropertiesService 裡,金鑰與程式邏輯分開,換金鑰時只要改設定不用動程式,也方便日後把程式分享給同事而不外流機密,是官方建議的正確做法。
先到 Apps Script 左側的「執行項目」查看有沒有執行紀錄與錯誤訊息。最常見原因有三個:一是金鑰沒設定或多了空白,二是第一次沒完成授權,三是觸發器事件來源選錯成時間驅動而非表單。逐一檢查這三點,並手動再填一次表單測試,通常就能找出問題所在。
這正是為什麼程式裡要加一層白名單過濾。就算提示詞已經限定選項,AI 偶爾還是會多加標點或說明。程式收到回覆後,用陣列檢查它是否在允許清單中,不在就一律歸到「其他」。這樣即使 AI 回答不如預期,資料夾名稱也不會亂掉,整個流程仍然穩定運作。
不會。程式對每一筆提交只判斷一次類別、只建立或取用一個對應資料夾、只產生一份文件,並用 addFile 搬進去後立刻從根目錄移除。只要不重複觸發同一個事件,就是一進一出,一筆對一份文件,不會出現重複歸檔的情況。
影響不大。程式會把所有問答整理成一段完整文字再交給 Gemini,內容越完整,AI 判斷反而越準。若題目特別多,可以在提示詞裡明確指出「主要依據需求描述欄位判斷」,引導 AI 聚焦在關鍵欄位,避免被次要資訊干擾,判斷結果會更貼近你的預期。
有兩個層面。Gemini API 免費方案有每分鐘與每日的呼叫上限,小型表單通常用不完;Apps Script 也有每日執行時間與 UrlFetchApp 呼叫次數配額,個人帳號額度相當充裕。若表單量很大,建議改成批次處理,每小時一次把累積的回覆一起判斷歸檔,就能大幅降低呼叫次數。
可以,但根資料夾的取得方式要改。共用雲端硬碟不是用 getRootFolder,而是先用 DriveApp.getFolderById 指定那個團隊資料夾的 ID(從網址列複製),再以它為 parent 呼叫 getOrCreateFolder。另外要確認執行程式的帳號對該共用硬碟有編輯權限,否則建立資料夾與搬檔會失敗。
可以。把 DocumentApp 那段改成用 DriveApp.createFile 建立純文字檔即可,例如傳入檔名、內容與 MimeType 為純文字。純文字檔容量小、建立快,但缺點是沒有標題樣式與排版。如果只是留存記錄,純文字很夠用;若日後要人閱讀或加註解,Google 文件會比較方便。
完全可行,而且很簡單。在主流程存檔完成後,加一行 GmailApp.sendEmail,把收件者設成自己的信箱,主旨帶入類別與時間,內文附上文件連結(用 doc.getUrl 取得)。這樣每次有新回覆歸檔,你的信箱就收到一封通知,不必一直開著雲端硬碟等,也能第一時間掌握進件狀況。
把「收件、判斷、建資料夾、存檔」交給流程自動完成後,你每天省下的不只是時間,更是那種「別漏掉、別分錯」的心理負擔。這只是 Workspace 自動化的起點,接下來你可以把行事曆、Gmail、試算表全部串起來,打造屬於團隊的 AI 助理。
想讓團隊用 AI+自動化把重複工作交給流程?賴家榮提供 Workspace/GAS/Gemini 企業內訓與大學課程。
預約授課・免費諮詢本文為賴家榮 AI 教學中心原創教學內容;想讓團隊學會用 AI,歡迎看AI 課程或預約授課 →
代表圖片來源:圖片來源:Pexels