GAS 智能開發與教學助手 — Chrome Extension (Manifest V3)
直接嵌入 Google Apps Script 編輯器側邊欄,提供 AI 驅動的問答輔導與完整程式碼生成能力。
| 功能 | 說明 |
|---|---|
| 💬 Q&A 問答模式 | 白話條列解答 GAS 問題:觸發器設定、HtmlService 模板、Gmail/Drive 串接、執行記錄、JDBC 資料庫等 |
| 💻 Code 程式碼模式 | 依需求生成完整可執行的 GAS V8 程式碼,含繁中註解、⚠️ 標示填入變數、try/catch 錯誤處理 |
| 🔍 Diff 差異預覽 | 程式碼插入前逐行對比現有程式,確認後才寫入,支援 Ctrl+Z 復原 |
| 📄 HTML 模板支援 | 自動偵測 .html / .gs 檔案,切換語法高亮與 AI 的 HtmlService scriptlet 知識 |
| ⚡ Monaco 直接注入 | 讀取/寫入 GAS Monaco Editor,支援「替換整個檔案」與「貼到游標位置」兩種模式 |
| 📚 獨立對話歷史 | Q&A / Code 各有獨立歷史,按檔案分離;支援單筆刪除與批次管理 |
| 🎨 雙模式視覺區隔 | Q&A 藍色系 / Code 綠色系,聊天區背景、傳送按鈕、輸入框同步配色 |
| 🔒 本機安全儲存 | API Key 僅存於 chrome.storage.local,不經任何第三方伺服器 |
Chrome Extension Manifest V3
├── background.js Service Worker:RELAY_GET_CODE / RELAY_SET_CODE / RELAY_INSERT_AT_CURSOR
│ chrome.scripting.executeScript (MAIN world) 直接存取 window.monaco
├── content.js Content Script(佔位用;所有 Monaco 邏輯在 background.js)
├── sidepanel.html/js/css 側邊欄 UI
│ ├── Tailwind CSS 本機化(MV3 CSP)
│ ├── marked.min.js Markdown 渲染
│ └── highlight.min.js 程式碼語法高亮(GitHub Dark 主題)
├── 128.png 128×128 PNG 圖示(Chrome Web Store 要求)
└── icons/ SVG 圖示(16 / 48px)
LLM: Google Gemini gemini-2.5-flash(SSE 串流端點,需 Google AI Studio API Key)
前往 Google AI Studio 建立免費 API Key(AIzaSy...)。
chrome://extensionsmanifest.json 的根目錄)| Q&A 模式 💬 | Code 模式 💻 | |
|---|---|---|
| 用途 | 問答、解釋、操作步驟引導 | 生成完整可執行程式碼 |
| 配色 | 藍色系 | 綠色系 |
| 程式碼輸出 | 僅 3–8 行短片段輔助說明 | 完整函式 + 使用步驟 |
| 歷史 | 獨立(按檔案) | 獨立(按檔案) |
Code 模式下,AI 回應的程式碼區塊右側提供:
切換至 GAS 專案中的 .html 檔案時,AI 會自動:
html 語法高亮顯示程式碼<? ?>、<?= ?>、<?!= ?>、google.script.run)| Q&A 模式 | Code 模式 |
|---|---|
| 解釋程式碼 | 加說明標示 |
| 找 Bug | 優化效能 |
| 設觸發器 | 加錯誤處理 |
| 錯誤分析 | 重新生成 |
重新生成:刪除前一輪 AI 回覆,以相同問題重新送出(非追加新對話)。
×,點擊立即刪除點擊模式列的「📁」按鈕,勾選專案中其他 .gs / .html 檔案名稱,提供給 AI 作為背景資訊(跨檔案函式呼叫關係)。
getValues() / setValues() 批次讀寫(效能最佳實踐)SpreadsheetApp vs openById() 使用時機HtmlService.createTemplateFromFile() / createHtmlOutputFromFile()<? ?>、<?= ?>、<?!= ?>google.script.run 前端呼叫後端函式doGet / doPost)Logger.log() vs console.log() 在觸發器中的差異Gmail、Google Drive、Google 日曆、Google 文件、Google 表單、Google 幻燈片、Admin SDK
UrlFetchApp.fetch() — HTTP 請求(GET / POST / 自訂 headers)PropertiesService 儲存設定(替代全域變數)ScriptApp.getOAuthToken() 取得 OAuth tokenUrlFetchApp 20,000 次/日(免費)、Email 100 封/日、執行時間 6 分鐘上限等
GAS 編輯器使用的 Monaco Editor 僅存在於頁面的 MAIN world(window.monaco)。
Content Script 執行於隔離的 Isolated World,無法存取頁面全域變數。
解決方案:所有 Monaco 操作透過 background.js 的 chrome.scripting.executeScript({ world: 'MAIN' }) 執行:
// sidepanel.js → background.js → Monaco (MAIN world)
chrome.runtime.sendMessage({ type: 'RELAY_GET_CODE' });
// background.js 接收後:
chrome.scripting.executeScript({
target: { tabId },
world: 'MAIN',
func: () => window.monaco?.editor?.getEditors?.()?.[0]?.getValue()
});
使用 streamGenerateContent?alt=sse 端點,token 逐步顯示:
const res = await fetch(
`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?key=${key}&alt=sse`,
{ method: 'POST', body: JSON.stringify({ system_instruction, contents, generationConfig }) }
);
// ReadableStream 逐 chunk 解析 SSE events
最多自動重試 3 次,每次等待 15 秒倒數:
async function callGemini(userMessage, retryCount = 0) {
// ...
if (res.status === 429) {
if (retryCount >= 3) { /* 顯示錯誤,停止重試 */ return; }
for (let remaining = 15; remaining > 0; remaining--) {
noteContent.textContent = `☕ API 流量限制,${remaining} 秒後自動重試(第 ${retryCount + 1}/3 次)...`;
await new Promise(r => setTimeout(r, 1000));
}
state.isLoading = false;
return await callGemini(userMessage, retryCount + 1);
}
}
所有 CDN 依賴已下載至 lib/ 本機目錄,不使用任何外部 URL:
<!-- ✅ 正確 -->
<link rel="stylesheet" href="lib/tailwind.min.css">
<script src="lib/marked.min.js"></script>
<!-- ❌ MV3 CSP 封鎖 -->
<script src="https://cdn.tailwindcss.com"></script>
相同程式碼不重複傳送,改以函式清單摘要節省 token:
// 程式碼未變動時
contextualMessage = `【程式碼】: 同本對話前一則,內容未變動\n函式:${functions.join('、')}`;
// 程式碼有變動時,完整傳送
contextualMessage = `【程式碼內容】:\n\`\`\`javascript\n${code}\n\`\`\``;
chrome.storage.local),不傳送至任何第三方| 版本 | 日期 | 說明 |
|---|---|---|
| 1.1.0 | 2026-04-12 | HTML 模板檔案支援、雙模式視覺區隔(藍/綠配色)、Q&A 全面補入 GAS 生態系知識(觸發器/HtmlService/Gmail/JDBC 等)、修復「重新生成」按鈕、429 重試上限(最多 3 次)、插入後游標保留、首次使用 📁 按鈕修復、歷史訊息解析優化 |
| 1.0.0 | 2026-04-06 | 初始版本:Q&A / Code 雙模式、SSE 串流、Monaco 直接注入、Diff 差異預覽、獨立對話歷史、批次歷史管理、多檔案上下文 |
MIT License — 自由使用、修改與散佈。