--- title: 活動組文檔—回饋表單設定 tags: - 活動組 - 文書組 - 文檔 --- # 回饋表單設定 為了加速填寫與計算結案書,活動紀錄核心能力的評分採用線上表單的形式。同時近一步的採用 Google App Script 協助計算,可以省下更多時間。 ![圖片](https://hackmd.io/_uploads/BkwYb6VmJe.png) 從模板複製舊有的回饋表單,有分: - 回饋表單 - 工作人員回饋表單 先進入回饋表單點選 `連結至試算表`,再進入工作人員回饋表單點選 `連結至試算表` 連結到現有的試算表,應該會出現在第一個。 請務必將兩個表單的 `在試算表中查看` 設定成同一個。設定完畢後,新增一個工作表,將名稱改成 `統計`。 在回饋表單的試算表中點選 `擴充功能` > `App Script`,然後將專案名稱改成活動名稱。並貼上以下程式碼: ```js /* 0.活動整體滿意度 1.能從與他人互動中,汲取正面有用的經驗。 2.能檢討自己能力不足之處,並願意主動學習。 3.能接受、學習新事物,以累積創新能量。 4.能產生新穎且創新的想法。 5.能培養發現問題的靈敏度。 6.能尊重社會的多元群體。 7.能在日常生活中發掘需要幫助與關懷的人。 8.能接納團隊成員意見。 9.能支持團隊的決定,並全力以赴。 10.當問題超出能力解決範圍時,能分析並積極尋求協助。 11.請你用20個字說明參與此活動的心得。 */ function onFormSubmit(e) { calculateStatistics(); } function text2score(text) { if(text === "提升很多" || text === "非常滿意") return 5; else if(text === "略有提升" || text === "滿意") return 4; else if(text === "差不多" || text === "普通") return 3; else if(text === "略有降低" || text === "不滿意") return 2; else if(text === "降低很多" || text === "非常不滿意") return 1; return 0; } function calculateStatistics() { var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); var memberSheet = spreadSheet.getSheetByName("參與人員"); var workerSheet = spreadSheet.getSheetByName("工作人員"); var statisticSheet = spreadSheet.getSheetByName("統計"); // 計算參與人員統計 var memberStats = calculateGroupStats(memberSheet, "參與人員"); // 計算工作人員統計 var workerStats = calculateGroupStats(workerSheet, "工作人員"); // 更新統計表 updateStatisticSheet(statisticSheet, memberStats, workerStats); } function calculateGroupStats(sheet, groupName) { var data = sheet.getDataRange().getValues(); var headers = data[0]; var stats = { groupName: groupName, totalResponses: data.length - 1, // 扣除表頭 questionStats: [] }; // 計算每個問題的統計資料 (從第2列開始,跳過時間戳記) for(let col = 1; col <= 11; col++) { let scores = []; for(let row = 1; row < data.length; row++) { let score = text2score(data[row][col]); if(score > 0) scores.push(score); } // 計算統計值 let sum = scores.reduce((a, b) => a + b, 0); let avg = scores.length > 0 ? sum / scores.length : 0; let max = scores.length > 0 ? Math.max(...scores) : 0; let min = scores.length > 0 ? Math.min(...scores) : 0; stats.questionStats.push({ question: headers[col], average: avg, max: max, min: min, responses: scores.length }); } return stats; } function updateStatisticSheet(sheet, memberStats, workerStats) { // 移除篩選器 if (sheet.getFilter()) { sheet.getFilter().remove(); } // 清空現有統計資料 sheet.clear(); // 設定列寬 sheet.setColumnWidth(1, 300); // A列 - 問題欄位 sheet.setColumnWidth(2, 80); // B列 - 數值欄位 sheet.setColumnWidth(3, 65); // C列 - 數值欄位 sheet.setColumnWidth(4, 65); // D列 - 數值欄位 sheet.setColumnWidth(5, 40); // E列 - 間隔 sheet.setColumnWidth(6, 300); // F列 - 問題欄位 sheet.setColumnWidth(7, 80); // G列 - 數值欄位 sheet.setColumnWidth(8, 65); // H列 - 數值欄位 sheet.setColumnWidth(9, 65); // I列 - 數值欄位 // 寫入更新時間 sheet.getRange("A1").setValue("統計更新時間"); sheet.getRange("B1").setValue(new Date()); // 寫入左側參與人員統計標題 sheet.getRange("A3").setValue(memberStats.groupName + " 統計"); sheet.getRange("B3").setValue("總回應數"); sheet.getRange("C3").setValue(memberStats.totalResponses); // 寫入右側工作人員統計標題 sheet.getRange("F3").setValue(workerStats.groupName + " 統計"); sheet.getRange("G3").setValue("總回應數"); sheet.getRange("H3").setValue(workerStats.totalResponses); // 設定表頭 let headers = ["問題", "平均分數", "最高分", "最低分"]; sheet.getRange(5, 1, 1, 4).setValues([headers]); // 左側表頭 sheet.getRange(5, 6, 1, 4).setValues([headers]); // 右側表頭 // 準備數據 let memberData = memberStats.questionStats.map(stat => [ stat.question, stat.average, stat.max, stat.min ]); let workerData = workerStats.questionStats.map(stat => [ stat.question, stat.average, stat.max, stat.min ]); // 寫入參與人員數據(左側) let memberRange = sheet.getRange(6, 1, memberData.length, 4); memberRange.setValues(memberData); sheet.getRange(6, 2, memberData.length, 1).setNumberFormat("0.00"); // 寫入工作人員數據(右側) let workerRange = sheet.getRange(6, 6, workerData.length, 4); workerRange.setValues(workerData); sheet.getRange(6, 7, workerData.length, 1).setNumberFormat("0.00"); sheet.getRange("A18").setValue("核心指標"); sheet.getRange("B18").setValue("平均分數"); sheet.getRange("A19").setValue("整體滿意度平均"); sheet.getRange("B19").setValue(memberData[0][1]); sheet.getRange("A20").setValue("反思探索(1.2題)"); sheet.getRange("B20").setValue((memberData[1][1] + memberData[2][1]) / 2); sheet.getRange("A21").setValue("思維創新(3.4題)"); sheet.getRange("B21").setValue((memberData[3][1] + memberData[4][1]) / 2); sheet.getRange("A22").setValue("問題解決 (5題)"); sheet.getRange("B22").setValue(memberData[5][1]); sheet.getRange("A23").setValue("關懷回饋(6.7題)"); sheet.getRange("B23").setValue((memberData[6][1] + memberData[7][1]) / 2); // row col sheet.getRange(18, 2, memberData.length, 1).setNumberFormat("0.00"); sheet.getRange("F18").setValue("核心指標"); sheet.getRange("G18").setValue("平均分數"); sheet.getRange("F19").setValue("整體滿意度平均"); sheet.getRange("G19").setValue(workerData[0][1]); sheet.getRange("F20").setValue("反思探索(1.2題)"); sheet.getRange("G20").setValue((workerData[1][1] + workerData[2][1]) / 2); sheet.getRange("F21").setValue("思維創新(3.4題)"); sheet.getRange("G21").setValue((workerData[3][1] + workerData[4][1]) / 2); sheet.getRange("F22").setValue("問題解決 (5.10題)"); sheet.getRange("G22").setValue((workerData[5][1] + workerData[10][1]) / 2); sheet.getRange("F23").setValue("關懷回饋(6.7題)"); sheet.getRange("G23").setValue((workerData[6][1] + workerData[7][1]) / 2); sheet.getRange("F24").setValue("團隊合作(8.9題)"); sheet.getRange("G24").setValue((workerData[8][1] + workerData[9][1]) / 2); // row col sheet.getRange(18, 8, workerData.length, 1).setNumberFormat("0.00"); // 設定標題樣式 let titleRanges = [/*"A1:B1", */"A3:C3", "F3:H3", "A5:D5", "F5:I5", "A18:B18","F18:G18"]; titleRanges.forEach(range => { sheet.getRange(range) .setBackground("#f3f3f3") .setFontWeight("bold"); }); // 設定框線 let dataRanges = ["A3:C3", "F3:H3", "A5:D" + (5 + memberData.length), "F5:I" + (5 + workerData.length), "A18:B23", "F18:G24"]; dataRanges.forEach(range => { sheet.getRange(range) .setBorder(true, true, true, true, false, true, "black", SpreadsheetApp.BorderStyle.SOLID); }); } ``` 貼上完畢後,將腳本儲存(`Ctrl` + `s`)至雲端硬碟。 接著在右方選單選擇 `觸發條件` > `新增觸發條件`,將選取活動類型改成表單提交時,或是有自己設定舒服的選項也行。設定完畢後點選 `儲存`。