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的简单触发器,编辑表格时自动运行,无需手动配置触发器
- 核心逻辑:
- 只响应Sheet1中A列的输入操作,其他场景直接跳过
- 获取录入的姓名,空值直接忽略
- 遍历表格所有数据行,寻找同名且未填写签出时间的行
- 找到匹配行则在该行C列写入当前时间,同时清空输入的姓名单元格
- 未找到匹配行则在新行的B列写入签到时间
自定义调整
如果你的表格列结构不同,只需修改对应列的编号即可:
- 若姓名列不是A列,修改
e.range.getColumn() !== 1中的数字(A=1,B=2,以此类推) - 若签出列不是C列,修改
sheet.getRange(targetRowNum, 3)中的数字 - 若签到列不是B列,修改
sheet.getRange(lastRow + 1, 2)中的数字
内容的提问来源于stack exchange,提问作者Askeladd
相关产品推荐
相关产品推荐

