Google 試算表資料庫設定說明
重要更新!
為了支援「讀取已存測驗」的新功能,GAS 程式碼已更新。請務必將下方的完整程式碼複製並重新部署到您的 Google Apps Script 專案中,否則新功能將無法使用。
本功能讓您可以將測驗資料儲存在自己的 Google 試算表,方便從任何裝置存取。請依照以下步驟設定:
- 前往 sheets.new 建立一份新的 Google 試算表。
- 在試算表頂部選單,點選「擴充功能」 > 「Apps Script」。
- 將編輯器中所有預設程式碼 (
function myFunction() { ... }
) 刪除。
- 複製下方的完整程式碼,並貼到 Apps Script 編輯器中。
- 點擊上方的「儲存專案」圖示 (💾)。
- 點擊右上角的「部署」按鈕,選擇「新增部署作業」。
- 在「選取類型」旁點擊齒輪圖示 (⚙️),選擇「網頁應用程式」。
- 在「誰可以存取」的下拉選單中,選擇「任何人」。(這是為了讓網頁能公開讀取您儲存的測驗資料)
- 點擊「部署」按鈕。
- 在彈出的視窗中,點擊「授予存取權」,並依照指示完成 Google 帳戶授權。
- 授權完成後,您會看到一個「網頁應用程式」的網址。請複製此網址。
- 將複製的網址,貼到本網頁原始碼 (HTML) 中 `gasWebAppUrl` 變數的引號內,取代預設的網址。
Google Apps Script (GAS) 程式碼 (請完整複製):
function doGet(e) {
const sheet = getSheet();
// Handle request for all quizzes list
if (e.parameter.action === 'list') {
if (sheet.getLastRow() <= 1) { // Only header row exists
return ContentService.createTextOutput(JSON.stringify({ "status": "success", "data": [] })).setMimeType(ContentService.MimeType.JSON);
}
const data = sheet.getDataRange().getValues();
const headers = data.shift();
const idColIndex = headers.indexOf("測驗ID");
const nameColIndex = headers.indexOf("測驗名稱");
if (idColIndex === -1 || nameColIndex === -1) {
return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": "找不到 '測驗ID' 或 '測驗名稱' 欄位" })).setMimeType(ContentService.MimeType.JSON);
}
const quizzes = data.map(row => ({
id: row[idColIndex],
name: row[nameColIndex]
})).filter(q => q.id && q.name); // Filter out empty rows
return ContentService.createTextOutput(JSON.stringify({ "status": "success", "data": quizzes })).setMimeType(ContentService.MimeType.JSON);
}
// Handle request for a single quiz by ID
if (e.parameter.id) {
const data = sheet.getDataRange().getValues();
const headers = data.shift();
const idColIndex = headers.indexOf("測驗ID");
if (idColIndex === -1) {
return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": "找不到 '測驗ID' 欄位" })).setMimeType(ContentService.MimeType.JSON);
}
for (let i = 0; i < data.length; i++) {
if (data[i][idColIndex] == e.parameter.id) {
let quizData = {};
headers.forEach((header, index) => {
quizData[header] = data[i][index];
});
return ContentService.createTextOutput(JSON.stringify({ "status": "success", "data": quizData })).setMimeType(ContentService.MimeType.JSON);
}
}
return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": "找不到指定的測驗" })).setMimeType(ContentService.MimeType.JSON);
}
// Default error if no valid parameters are provided
return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": "缺少必要參數 (id 或 action)" })).setMimeType(ContentService.MimeType.JSON);
}
function doPost(e) {
try {
const sheet = getSheet();
const headers = ["測驗ID", "測驗名稱", "YouTube網址", "影片ID", "題目資料", "建立時間"];
if (sheet.getLastRow() < 1) {
sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
}
const postData = JSON.parse(e.postData.contents);
if (!postData.id || !postData.quizName || !postData.youtubeUrl || !postData.videoId || !postData.questions) {
return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": "傳入的資料不完整" })).setMimeType(ContentService.MimeType.JSON);
}
const newRow = [
postData.id,
postData.quizName,
postData.youtubeUrl,
postData.videoId,
JSON.stringify(postData.questions),
new Date()
];
sheet.appendRow(newRow);
return ContentService.createTextOutput(JSON.stringify({ "status": "success", "message": "資料已成功儲存" })).setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": error.toString() })).setMimeType(ContentService.MimeType.JSON);
}
}
function getSheet() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheetName = "測驗資料庫";
let sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
sheet = spreadsheet.insertSheet(sheetName);
const headers = ["測驗ID", "測驗名稱", "YouTube網址", "影片ID", "題目資料", "建立時間"];
sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
}
return sheet;
}
如何修改預設 API 金鑰?
如果您希望為這個 HTML 檔案設定一個預設的 Gemini API 金鑰,請用文字編輯器打開此 HTML 檔案,找到靠近底部的 <script>
區塊,修改以下這行程式碼:
let googleAiApiKey = localStorage.getItem('googleAiApiKey') || '12345678';
將 '12345678'
替換成您自己的 API 金鑰即可。使用者仍然可以透過「設定 AI 來源」介面輸入新的金鑰來覆蓋預設值。