Google App Script需求:匹配指定行自动累加Tally计数
问题描述
我有一个剧集标题列表,团队成员可点击按钮通过表格公式随机选择标题。目前已用Google App Script实现行项创建/更新时自动添加「添加日期」和「最后修改时间戳」,现在需要统计标题的使用次数。
当前已实现点击+1按钮对选中单元格累加1的计数功能,但需要手动定位对应标题行并选中F列(Tally列)的单元格,操作效率很低。
希望通过Google App Script实现以下自动功能:
- 获取B3单元格的字符串内容
- 在列表中查找匹配该内容的行
- 定位该行的F列(Tally)单元格
- 将该单元格的数值累加1
作为脚本初学者,我没能找到解决方案,现有相关代码如下:
//Updates the sheet on button click to force re-roll the RAND function and select a new title in cell b3 function updateCheckbox() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheets()[0]; if (sheet.getRange('H3').isChecked() === true) { sheet.getRange('H3').setValue('FALSE'); } else { sheet.getRange('H3').setValue('TRUE'); } } //housing function to add/update timestamps function onEdit(e) { addTimestamp(e); if(e.range.getA1Notation() == "B3"){ incrementDupe(); } } //adds timestamps in Cols D and E, updates Col E when changes are made in that row function addTimestamp(e) { var row = e.range.getRow(); var col = e.range.getColumn(); var sheet = SpreadsheetApp.getActive().getSheetByName('Titles'); var currentDate = new Date(); if(col === 2 && row > 7 && e.source.getActiveSheet().getName() === "Titles"){ e.source.getActiveSheet().getRange(row,6).setValue(0); e.source.getActiveSheet().getRange(row,5).setValue(currentDate); if(e.source.getActiveSheet().getRange(row,4).getValue() == ""){ e.source.getActiveSheet().getRange(row,4).setValue(currentDate); } } } //Click tally cell for a row, click +1 button to increase the value in that cell function plus1() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var numRange = sheet.getActiveRange; var numAdd = numRange.getValue(); numRange.setValue(numAdd + 1); } //very rough start with automating the tally function function incrementDupe(){ var ss = SpreadsheetApp.getActiveSpreadsheet() var sheet = ss.getSheetByName('Titles'); var dataRange = dataSheet.getRange("B3:E").getValues(); var chosenTitle = var //dataSheet.getRange() //offset(0,2).getValue() }
解决方案
完善incrementDupe函数并修正现有代码的小问题,即可实现自动计数功能,完整代码如下:
// 点击按钮刷新随机选择(切换复选框状态触发公式重算) function updateCheckbox() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheets()[0]; var checkbox = sheet.getRange('H3'); checkbox.setValue(!checkbox.isChecked()); } // 编辑事件触发器:处理时间戳和自动计数 function onEdit(e) { addTimestamp(e); if(e.range.getA1Notation() == "B3"){ incrementDupe(); } } // 添加/更新日期时间戳 function addTimestamp(e) { var row = e.range.getRow(); var col = e.range.getColumn(); var sheet = e.source.getActiveSheet(); var currentDate = new Date(); if(col === 2 && row > 7 && sheet.getName() === "Titles"){ sheet.getRange(row,6).setValue(0); sheet.getRange(row,5).setValue(currentDate); if(sheet.getRange(row,4).getValue() == ""){ sheet.getRange(row,4).setValue(currentDate); } } } // 手动选中单元格点击+1计数 function plus1() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var numRange = sheet.getActiveRange(); // 修正:调用方法需加() var numAdd = numRange.getValue() || 0; numRange.setValue(numAdd + 1); } // 自动累加B3选中标题的计数 function incrementDupe(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('Titles'); // 获取B3的选中标题,去除首尾空格避免匹配误差 var chosenTitle = sheet.getRange('B3').getValue().trim(); if(!chosenTitle) return; // 标题为空时直接退出 // 读取标题列(B8及以下,跳过表头)的所有数据 var lastRow = sheet.getLastRow(); if(lastRow <=7) return; // 无标题数据时退出 var titleRange = sheet.getRange(8, 2, lastRow-7, 1); var titles = titleRange.getValues().flat(); // 转为一维数组方便查找 // 查找匹配的标题索引 var matchIndex = titles.indexOf(chosenTitle); if(matchIndex === -1) return; // 未找到匹配标题时退出 // 计算目标行号并更新计数 var targetRow = 8 + matchIndex; var tallyCell = sheet.getRange(targetRow, 6); var currentCount = tallyCell.getValue() || 0; tallyCell.setValue(currentCount + 1); }
关键说明
- 修正了
plus1函数的语法错误:getActiveRange是方法,必须加()调用 - 简化了
updateCheckbox的逻辑,直接取反复选框状态,代码更简洁 incrementDupe核心逻辑:- 先获取B3的标题内容并去除空格,避免因空格导致匹配失败
- 读取标题列的所有数据,转为一维数组后用
indexOf快速定位匹配行 - 计算目标行号后,获取对应F列单元格,累加计数(为空时默认从0开始)
- 当B3的标题更新时,
onEdit触发器会自动调用incrementDupe,实现无手动操作的自动计数
内容的提问来源于stack exchange,提问作者Samantha Bartlett
相关产品推荐
相关产品推荐

