You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:37:21