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

Google Apps Script:实现表格匹配姓名并在同行插入签到签出时间戳

签到签出匹配同一行的Google Apps Script解决方案

我举办了一场活动,参与者使用带二维码的卡片进行签到签出,系统会录入参与者姓名。目前使用一份在线找到的Google Apps Script脚本可自动在姓名旁插入时间戳,但需求是当同一参与者签出时,能匹配到其签到所在行,在另一列自动插入签出时间戳,而非新增行。例如当Kyle再次出现时,自动将签出时间插入到他首次签到行的右侧列。

当前使用的代码

var s = SpreadsheetApp.getActiveSheet();

if( s.getName() == 'Sheet1' ) { 

var r = s.getActiveCell();

if( r.getColumn() == 1 ) { 

var nextCell = r.offset(0, 1);

if( nextCell.getValue() === '' ) 
nextCell.setValue(new Date());
}
if( r.getColumn() == 3 ) { 
  var nextCell = r.offset(0, 1);
if( nextCell.getValue() === '' ) 
nextCell.setValue(new Date());
}
if( r.getColumn() == 5 ) { 

var nextCell = r.offset(0, 1);

if( nextCell.getValue() === '' ) 
nextCell.setValue(new Date());
}
if( r.getColumn() == 7 ) { 

var nextCell = r.offset(0, 1);

if( nextCell.getValue() === '' ) 
nextCell.setValue(new Date());
}
}

解决方案代码

假设你的表格结构为:

  • A列:参与者姓名(用于扫码录入)
  • B列:签到时间
  • C列:签出时间

替换为以下代码即可实现需求:

function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  // 仅处理Sheet1的A列输入,其他操作直接跳过
  if (sheet.getName() !== 'Sheet1' || e.range.getColumn() !== 1) return;

  var participantName = e.value;
  if (!participantName) return; // 空输入不处理

  var dataRange = sheet.getDataRange();
  var allRows = dataRange.getValues();
  var targetRowNum = -1;

  // 遍历所有行,查找已签到但未签出的同名参与者
  for (var i = 0; i < allRows.length; i++) {
    var currentRow = allRows[i];
    // 姓名匹配,且签出时间(C列,索引为2)为空
    if (currentRow[0] === participantName && !currentRow[2]) {
      targetRowNum = i + 1; // 表格行号从1开始计数
      break;
    }
  }

  if (targetRowNum !== -1) {
    // 找到匹配行,插入签出时间到C列
    sheet.getRange(targetRowNum, 3).setValue(new Date());
    // 清空当前输入单元格,避免重复录入
    e.range.clearContent();
  } else {
    // 未找到匹配行,新增签到行并插入签到时间到B列
    var lastRow = sheet.getLastRow();
    sheet.getRange(lastRow + 1, 2).setValue(new Date());
  }
}

代码说明

  • 触发方式:这是Google Apps Script的简单触发器,编辑表格时自动运行,无需手动配置触发器
  • 核心逻辑:
    1. 只响应Sheet1中A列的输入操作,其他场景直接跳过
    2. 获取录入的姓名,空值直接忽略
    3. 遍历表格所有数据行,寻找同名且未填写签出时间的行
    4. 找到匹配行则在该行C列写入当前时间,同时清空输入的姓名单元格
    5. 未找到匹配行则在新行的B列写入签到时间

自定义调整

如果你的表格列结构不同,只需修改对应列的编号即可:

  • 若姓名列不是A列,修改e.range.getColumn() !== 1中的数字(A=1,B=2,以此类推)
  • 若签出列不是C列,修改sheet.getRange(targetRowNum, 3)中的数字
  • 若签到列不是B列,修改sheet.getRange(lastRow + 1, 2)中的数字

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:27:40