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

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);
}

关键说明

  1. 修正了plus1函数的语法错误:getActiveRange是方法,必须加()调用
  2. 简化了updateCheckbox的逻辑,直接取反复选框状态,代码更简洁
  3. incrementDupe核心逻辑:
    • 先获取B3的标题内容并去除空格,避免因空格导致匹配失败
    • 读取标题列的所有数据,转为一维数组后用indexOf快速定位匹配行
    • 计算目标行号后,获取对应F列单元格,累加计数(为空时默认从0开始)
  4. 当B3的标题更新时,onEdit触发器会自动调用incrementDupe,实现无手动操作的自动计数

内容的提问来源于stack exchange,提问作者Samantha Bartlett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:55:27