Google Sheets有无函数/脚本可按单元格值自动标记累计学科课时
问题说明
- 制作班级课程登记表时,需要对各学科课时做滚动累计统计,暂未找到可根据学科名称自动计算对应累计课时的实现方法
- 需求效果:表格第二列自动展示对应行学科的累计课时数,当前使用工具为Google Sheets,需要可实现根据另一单元格值自动计算对应单元格结果的函数或脚本方案
- 参考效果:

实现方案
方案一:原生函数实现(推荐,无需额外权限)
默认假设学科名称存放在C列,第1行为表头,第2行起为有效数据,累计课时需要展示在B列:
- 如果每节课课时固定为1,直接在B2单元格输入以下公式,下拉填充整列即可:
=COUNTIF(C$2:C2,C2) - 如果每节课课时不固定,实际课时数存放在D列,需要按实际课时累加,将公式替换为:
=SUMIF(C$2:C2,C2,D$2:D2)
公式逻辑:通过混合引用锁定统计范围的起始行,每向下填充一行,统计范围就自动扩展到当前行,仅对范围内和当前行学科名一致的条目计数/求和,实现滚动累计效果。
如果需要避免手动下拉填充,可以在B2单元格使用数组公式,自动对整列生效:
- 固定单课时累计数组公式:
=BYROW(C2:C,LAMBDA(x,IF(x="","",COUNTIF(C2:INDEX(C:C,ROW(x)),x)))) - 按实际课时累计数组公式:
=BYROW(C2:C,LAMBDA(x,IF(x="","",SUMIF(C2:INDEX(C:C,ROW(x)),x,D2:INDEX(D:D,ROW(x))))))
方案二:Apps Script脚本实现(适合自定义扩展场景)
如果需要写入静态累计值、不需要保留公式,或者需要叠加其他自定义逻辑,可以用脚本实现:
- 打开表格后点击顶部菜单「扩展程序」→「Apps 脚本」,进入脚本编辑页面
- 删除编辑器内默认的示例代码,粘贴以下代码:
function onEdit(e) { const sheet = e.source.getActiveSheet(); // 按实际表格位置修改配置:subjectCol是学科所在列号(C列为3),cumulativeCol是累计课时列号(B列为2),startRow是数据起始行号 const CONFIG = { subjectCol: 3, cumulativeCol: 2, startRow: 2 } const triggerRow = e.range.getRow(); const triggerCol = e.range.getColumn(); if(triggerCol !== CONFIG.subjectCol || triggerRow < CONFIG.startRow) return; const currentSubject = e.value; if(!currentSubject) { sheet.getRange(triggerRow, CONFIG.cumulativeCol).clearContent(); return; } const subjectRange = sheet.getRange(CONFIG.startRow, CONFIG.subjectCol, triggerRow - CONFIG.startRow + 1, 1); const subjectList = subjectRange.getValues().flat(); const cumulativeNum = subjectList.filter(item => item === currentSubject).length; sheet.getRange(triggerRow, CONFIG.cumulativeCol).setValue(cumulativeNum); }
- 保存脚本后完成授权,回到表格编辑学科列内容时,会自动在第二列写入对应累计课时数。
该脚本为编辑触发逻辑,仅对新编辑的行自动计算;如果是已经录入完成的历史数据,可以逐行点选学科列单元格触发重算,也可以自行在脚本中添加批量处理历史数据的逻辑。
内容的提问来源于stack exchange,提问作者user19460043
相关产品推荐
相关产品推荐

