求助Google Sheets公式:识别会员ID最新扫描并关联进出状态
会员进出状态自动更新解决方案
公式实现方案(无需脚本)
适合你目前对公式有基础的情况,核心逻辑是通过统计会员ID的扫描次数,奇数次标记为In,偶数次标记为Out(首次扫描默认进入)。
在会员列表的D列(比如D2单元格)输入以下公式,下拉填充即可:
=IF(ISBLANK(A2), "", LET( id_scans, FILTER('扫描记录'!B:B, '扫描记录'!A:A = A2), scan_count, COUNTA(id_scans), IF(scan_count = 0, "未扫描", IF(MOD(scan_count, 2) = 1, "In", "Out")) ) )
公式说明:
FILTER:筛选出当前会员ID的所有扫描时间戳COUNTA:统计该ID的扫描总次数MOD:判断次数奇偶性,奇数对应进入状态,偶数对应离开状态ISBLANK:处理空ID的情况,避免显示错误
脚本实现方案(自动更新)
如果需要每次扫描ID后自动切换状态,可使用Google Apps Script实现自动触发:
- 打开你的Google表格,点击「扩展程序」→「Apps脚本」
- 粘贴以下代码(注意修改标签页名称为你实际使用的名称):
function onEdit(e) { const scanSheet = e.source.getActiveSheet(); // 替换为你的扫描记录标签页名称 if (scanSheet.getName() !== "扫描记录") return; const editedRow = e.range.getRow(); const memberId = scanSheet.getRange(editedRow, 1).getValue(); if (!memberId) return; // 替换为你的会员列表标签页名称 const memberSheet = e.source.getSheetByName("会员列表"); const idList = memberSheet.getRange("A:A").getValues(); // 查找匹配的会员并切换状态 for (let i = 0; i < idList.length; i++) { if (idList[i][0] === memberId) { const statusCell = memberSheet.getRange(i + 1, 4); const currentStatus = statusCell.getValue(); statusCell.setValue(currentStatus === "In" ? "Out" : "In"); break; } } }
- 保存脚本,授权必要的权限(首次运行会提示权限申请,按照引导完成即可)
脚本说明:
- 当「扫描记录」标签页新增或编辑ID时,自动触发脚本
- 匹配会员列表中的对应ID,切换其D列的
In/Out状态 - 若会员之前无状态记录,默认设置为
In
注意事项:
- 公式方案在数据量较大时可能有轻微延迟,刷新页面即可同步
- 脚本方案需确保标签页名称与代码中一致,否则无法触发
- 若扫描记录存在重复的同一ID+时间戳,建议先清理数据,避免计数或状态切换错误
内容的提问来源于stack exchange,提问作者Bobby Gumpright
相关产品推荐
相关产品推荐

