在數位魔法學院的深處,每當需要收集意見、調查滿意度,或是進行市場研究時,傳統的問卷製作總是讓冒險者們頭疼不已。手工設計問題、思考選項、建立表單......這些繁瑣的步驟往往耗費大量時間與精力。
此刻,一道神奇的咒語在法師塔中被發現:
它們能夠將簡單的主題描述,瞬間轉化為專業完整的問卷表單,讓冒險者從繁瑣的手工作業中解脫,專注於更重要的策略思考。
步驟:
apiKey
變數核心咒語設定:
// 🔧 在這裡修改你的問卷主題
var SURVEY_TOPIC = "生成一份鐵人賽參賽者申請問卷,包含個人資料、體能狀況、參賽經驗及緊急聯絡人欄位。";
/**
* Day13:問卷生成器 (簡化版本)
* 使用方式:直接在程式碼中修改主題,然後執行函數
*/
function generateSurveyDirect() {
var SURVEY_TOPIC = "生成一份鐵人賽參賽者申請問卷,包含個人資料、體能狀況、參賽經驗及緊急聯絡人欄位。";
try {
Logger.log('開始生成問卷,主題:' + SURVEY_TOPIC);
var draftQuestions = callGeminiAPI(SURVEY_TOPIC);
if (!draftQuestions || draftQuestions.includes("錯誤")) throw new Error("API 呼叫失敗:" + draftQuestions);
Logger.log('✅ API 回應成功');
Logger.log('生成的問卷內容:\n' + draftQuestions);
console.log("問卷預覽已生成!請查看執行紀錄確認內容。");
PropertiesService.getScriptProperties().setProperty('DRAFT_QUESTIONS', draftQuestions);
return draftQuestions;
} catch (error) {
Logger.log('❌ generateSurveyDirect 發生錯誤:' + error.toString());
console.log('錯誤:' + error.toString());
}
}
function confirmAndCreateForm() {
try {
var draftQuestions = PropertiesService.getScriptProperties().getProperty('DRAFT_QUESTIONS');
if (!draftQuestions) { console.log('❌ 沒有找到問卷草稿,請先執行 generateSurveyDirect()'); return; }
Logger.log('開始建立表單...');
createFormFromText(draftQuestions);
PropertiesService.getScriptProperties().deleteProperty('DRAFT_QUESTIONS');
} catch (error) {
Logger.log('❌ confirmAndCreateForm 發生錯誤:' + error.toString());
console.log('建立表單失敗:' + error.toString());
}
}
function generateSurveyDirectly() {
var SURVEY_TOPIC = "生成一份鐵人賽參賽者申請問卷";
try {
Logger.log('一鍵生成問卷,主題:' + SURVEY_TOPIC);
var draftQuestions = callGeminiAPI(SURVEY_TOPIC);
if (!draftQuestions || draftQuestions.includes("錯誤")) throw new Error("API 呼叫失敗:" + draftQuestions);
Logger.log('✅ API 回應成功,直接建立表單...');
createFormFromText(draftQuestions);
} catch (error) {
Logger.log('❌ generateSurveyDirectly 發生錯誤:' + error.toString());
console.log('錯誤:' + error.toString());
}
}
function callGeminiAPI(userPrompt) {
var apiKey = 'YOUR_API_KEY_HERE';
var url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent';
var fullPrompt = `請根據以下主題生成一份中文問卷,格式要求:
標題:[問卷標題]
每個問題後面標註類型:(單選)、(多選)、(文字回覆)或(段落文字)
主題:${userPrompt}
`;
var payload = {"contents":[{"parts":[{"text":fullPrompt}]}], "generationConfig":{"temperature":0.3,"maxOutputTokens":1200}};
var options = {method:'POST', contentType:'application/json', headers:{'X-goog-api-key':apiKey}, payload:JSON.stringify(payload), muteHttpExceptions:true};
try {
var response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() !== 200) return "錯誤:API 呼叫失敗 (HTTP " + response.getResponseCode() + ")";
var result = JSON.parse(response.getContentText());
if (result.candidates && result.candidates.length > 0 && result.candidates[0].content) {
return result.candidates[0].content.parts[0].text;
} else { return "錯誤:API 回應格式不正確"; }
} catch (error) {
return "錯誤:" + error.toString();
}
}
function createFormFromText(questionsText) {
try {
var lines = questionsText.split('\n').map(line => line.trim()).filter(line => line !== '');
var formTitle = lines.find(line => line.match(/^標題[::]/))?.replace(/^標題[::]\s*/, '') || 'AI 生成問卷';
var form = FormApp.create(formTitle).setDescription('此問卷由 AI 自動生成,感謝您的填寫!');
for (var i=0;i<lines.length;i++) {
var line = lines[i];
if (!line || line.startsWith('-')) continue;
if (line.includes('(單選)')) {
var title=line.replace('(單選)','').replace(/^\d+\.?\s*/,'').trim(); var choices=[];
while(i+1<lines.length && lines[i+1].startsWith('-')) {i++; choices.push(lines[i].replace(/^-\s*/,'').trim());}
if(choices.length>0) form.addMultipleChoiceItem().setTitle(title).setChoiceValues(choices).setRequired(true);
} else if (line.includes('(多選)')) {
var title=line.replace('(多選)','').replace(/^\d+\.?\s*/,'').trim(); var choices=[];
while(i+1<lines.length && lines[i+1].startsWith('-')) {i++; choices.push(lines[i].replace(/^-\s*/,'').trim());}
if(choices.length>0) form.addCheckboxItem().setTitle(title).setChoiceValues(choices);
} else if (line.includes('(文字回覆)')) {
form.addTextItem().setTitle(line.replace('(文字回覆)','').replace(/^\d+\.?\s*/,'').trim());
} else if (line.includes('(段落文字)')) {
form.addParagraphTextItem().setTitle(line.replace('(段落文字)','').replace(/^\d+\.?\s*/,'').trim());
}
}
var sheet = SpreadsheetApp.create(formTitle + ' - 回覆資料');
form.setDestination(FormApp.DestinationType.SPREADSHEET, sheet.getId());
Logger.log('✅ 問卷表單建立完成! 編輯表單:' + form.getEditUrl());
} catch(error) { Logger.log('❌ 建立表單時發生錯誤:' + error.toString()); }
}
function testGeminiAPI() {
var testResult = callGeminiAPI("請生成一個簡單的測試問卷");
Logger.log("API 測試結果:" + testResult);
return testResult;
}
function showAvailableFunctions() {
Logger.log("1. generateSurveyDirect() - 生成問卷草稿並顯示預覽");
Logger.log("2. confirmAndCreateForm() - 確認草稿並建立表單");
Logger.log("3. generateSurveyDirectly() - 一鍵生成問卷(跳過確認)");
Logger.log("4. testGeminiAPI() - 測試 API 連線");
}
第一階段:生成預覽咒語
generateSurveyDirect(); // 生成問卷草稿並顯示預覽
執行效果:
第二階段:確認建立咒語
confirmAndCreateForm(); // 確認草稿並建立表單
執行效果:
對於信任 AI 生成品質的進階法師:
generateSurveyDirectly(); // 一鍵生成問卷(跳過確認)
// 修改程式碼中的主題陣列,可同時生成多個問卷
var topics = [
"餐廳用餐體驗調查",
"線上課程學習回饋",
"員工工作滿意度調查"
];
API 連線失效:
testGeminiAPI(); // 測試 API 連線狀態
權限設定問題:
表單格式異常:
透過 Google Apps Script 與 Gemini API 的完美結合,你可以將問卷設計從繁瑣的手工作業轉化為智慧自動化流程:
身為數位時代的問卷魔法師,掌握這套 AI 自動化咒語,就能在資料收集的戰場上如虎添翼,讓每一次的意見調查都成為洞察用戶需求、優化服務品質的強大武器。
相關連結