---
title: 活動組文檔—回饋表單設定
tags:
- 活動組
- 文書組
- 文檔
---
# 回饋表單設定
為了加速填寫與計算結案書,活動紀錄核心能力的評分採用線上表單的形式。同時近一步的採用 Google App Script 協助計算,可以省下更多時間。

從模板複製舊有的回饋表單,有分:
- 回饋表單
- 工作人員回饋表單
先進入回饋表單點選 `連結至試算表`,再進入工作人員回饋表單點選 `連結至試算表` 連結到現有的試算表,應該會出現在第一個。
請務必將兩個表單的 `在試算表中查看` 設定成同一個。設定完畢後,新增一個工作表,將名稱改成 `統計`。
在回饋表單的試算表中點選 `擴充功能` > `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`)至雲端硬碟。
接著在右方選單選擇 `觸發條件` > `新增觸發條件`,將選取活動類型改成表單提交時,或是有自己設定舒服的選項也行。設定完畢後點選 `儲存`。