如何通过onFormSubmit触发器从Google表格获取完整分数与总分?
嘿,这个问题我之前也碰到过!核心原因是Google Sheets显示的“5/10”只是单元格的显示格式,而单元格实际存储的只有答对的分数(也就是5),所以getValue()只会返回这个底层数值。要同时拿到答对数和总分,有两种非常靠谱的解决思路,看你的具体情况选:
方法1:利用onFormSubmit事件对象直接获取(强烈推荐)
既然你用的是onFormSubmit触发器,其实完全没必要从工作表里读分数——事件对象本身就带着表单响应的所有关键信息,包括用户的得分和对应测验的总分,这比从表格读取更准确,还能彻底避开格式问题。
直接上代码示例,你可以按需调整:
function onFormSubmit(e) { // 从事件对象里提取表单响应和表单实例 const formResponse = e.response; const form = e.source; // 获取用户得分和测验总分 const userScore = formResponse.getScore(); // 比如返回5 const totalPoints = form.getQuizSettings().getTotalPoints(); // 比如返回10 // 计算平均分(可以转成百分比,比如乘以100加%) const averageScore = userScore / totalPoints; // 获取姓名和邮箱(根据你表单的字段顺序调整索引) const name = formResponse.getItemResponses()[0].getResponse(); // 假设第一个字段是姓名 const email = formResponse.getRespondentEmail(); // 写入目标工作表 const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("你的目标工作表名"); targetSheet.appendRow([name, email, userScore, totalPoints, averageScore]); }
这个方法的优势在于:不管你的测验总分怎么变,都能自动获取对应的值,完全不受表格格式干扰,代码也更简洁高效。
方法2:如果总分存在工作表的其他列
如果每份测验的总分已经记录在提交数据的同一行(比如某一列专门存总分),那直接读取该行的总分单元格就行:
function onFormSubmit(e) { const inSheet = e.range.getSheet(); const inRow = e.range.getRow(); // 替换成你实际的列序号 const colNoScore = 3; // 分数列 const colNoTotal = 4; // 总分列 const userScore = inSheet.getRange(inRow, colNoScore).getValue(); const totalPoints = inSheet.getRange(inRow, colNoTotal).getValue(); const averageScore = userScore / totalPoints; // 获取姓名和邮箱(根据你的表格列调整) const name = inSheet.getRange(inRow, 1).getValue(); const email = inSheet.getRange(inRow, 2).getValue(); // 写入目标工作表 const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("你的目标工作表名"); targetSheet.appendRow([name, email, userScore, totalPoints, averageScore]); }
特殊情况:如果“5/10”是拼接的文本
要是你的分数列是用公式把答对数和总分拼成字符串(比如=A2&"/"&B2),那可以用getDisplayValue()代替getValue()拿到显示的文本,再拆分:
const scoreText = inSheet.getRange(inRow, colNoScore).getDisplayValue(); const [userScore, totalPoints] = scoreText.split("/").map(Number); const averageScore = userScore / totalPoints;
不过这种方法不如前两种可靠,一旦文本格式有变化(比如多了空格)就会出错,所以优先选前两种。
内容的提问来源于stack exchange,提问作者MartinK
相关产品推荐
相关产品推荐

