求Google Sheets数组公式,实现用餐记录格式标准化与重复数据删除
Google Sheets 字符串格式化数组公式
使用说明
将以下公式粘贴至结果列首行(如B1),原始数据存储在A列即可自动处理所有行内容,新增数据无需手动下拉公式。
最终公式
=ARRAYFORMULA(LET( // 读取A列所有非空原始数据 raw, FILTER(A:A, A:A<>""), // 提取方括号内的日期部分 date_part, REGEXEXTRACT(raw, ",\s*(.*?)\]"), // 标准化为d/m/yyyy格式,自动去除日月前置零 std_date, TEXT(DATEVALUE(date_part), "d/m/yyyy"), // 提取方括号后、冒号前的姓名,去除多余空格 name, TRIM(REGEXEXTRACT(raw, "\]\s*(.*?):")), // 提取冒号后的原始状态,合并多余空格 status_raw, TRIM(REGEXREPLACE(REGEXEXTRACT(raw, ":\s*(.*)"), "\s+", " ")), // 第一步修正状态:补全min的s,修正常见午餐拼写错误 status_clean, REGEXREPLACE(REGEXREPLACE(LOWER(status_raw), "(\d+)\s*min\b", "$1 mins"), "\b(lunc|luch|lunches)\b", "lunch"), // 第二步修正状态:修正常见晚餐拼写错误,补全时间与餐类间的空格 status_clean, REGEXREPLACE(REGEXREPLACE(status_clean, "\b(din|diner|dnner)\b", "dinner"), "(\d+mins)\s*(\w+)", "$1 $2"), // 第三步修正状态:统一No开头格式 status_clean, REGEXREPLACE(status_clean, "\bno\s*(\w+)", "No $1"), // 映射到指定的固定状态格式 status_std, SWITCH(TRUE, REGEXMATCH(status_clean, "no.*lunch"), "No lunch", REGEXMATCH(status_clean, "no.*dinner"), "No dinner", REGEXMATCH(status_clean, "15.*lunch"), "15mins lunch", REGEXMATCH(status_clean, "30.*lunch"), "30mins lunch", REGEXMATCH(status_clean, "45.*lunch"), "45mins lunch", REGEXMATCH(status_clean, "15.*dinner"), "15mins dinner", status_clean ), // 拼接最终结果,去重 UNIQUE(std_date & " " & name & " " & status_std) ))
功能匹配说明
- 动态数组效果:通过
ARRAYFORMULA+FILTER整列读取数据,新录入的原始数据会自动生成处理结果 - 冗余字符移除:正则提取时直接过滤时间、
[]、:、,等不需要的符号 - 日期格式标准化:通过
DATEVALUE转日期格式后用TEXT指定输出格式,自动去除日月的前置零 - 用餐状态纠错:先统一转小写消除大小写差异,再用正则修正拼写错误、补全缺漏的
s和空格,最后映射到指定的6种固定格式 - 重复条目去重:最终输出前调用
UNIQUE过滤掉日期、姓名、状态完全一致的重复行
内容的提问来源于stack exchange,提问作者Edmund Ong
相关产品推荐
相关产品推荐

