将10列姓名数据按指定规则合并为3列的技术问询
将10列姓名合并为3列的实现方案
需求规则
- 每组合并列的首个姓名前加
(,最后一个姓名后加),姓名间用逗号分隔 - 每列最多包含4个单词,超出则转入下一列
- 禁止拆分完整姓名:若当前列已有3个单词,无法加入双词姓名(会超4个上限),则当前列截止,下一列从该双词姓名开始
示例输入与输出
输入(每行10列姓名)
| 列1 | 列2 | 列3 | 列4 | 列5 | 列6 | 列7 | 列8 | 列9 | 列10 |
|---|---|---|---|---|---|---|---|---|---|
| Alice | Bob Smith | Charlie | Dave | Eve | Frank Lee | Grace | Henry | Iris | Jack |
| Evan Hill | Fiona | George | Helen | Ian | Jane Doe | Kevin | Lily | Mike | Nora |
预期输出(每行3列)
| 合并列1 | 合并列2 | 合并列3 |
|---|---|---|
| (Alice, Bob Smith, Charlie) | (Dave, Eve) | (Frank Lee, Grace, Henry) |
| (Evan Hill) | (Fiona, George, Helen) | (Ian, Jane Doe, Kevin) |
解决方案(Google Sheets)
方法1:Apps Script脚本(推荐,灵活易维护)
- 打开你的Google表格,点击「扩展程序」→「Apps Script」
- 清空默认代码,粘贴以下脚本:
function mergeNamesToColumns(row) { const names = row.filter(name => name !== ""); if (names.length === 0) return ["", "", ""]; const result = []; let currentColumn = []; let currentWordCount = 0; for (const name of names) { const wordCount = name.split(" ").length; if (currentWordCount + wordCount > 4) { if (currentColumn.length > 0) { result.push(`(${currentColumn.join(", ")})`); currentColumn = []; currentWordCount = 0; } } currentColumn.push(name); currentWordCount += wordCount; if (currentWordCount === 4) { result.push(`(${currentColumn.join(", ")})`); currentColumn = []; currentWordCount = 0; } } if (currentColumn.length > 0) { result.push(`(${currentColumn.join(", ")})`); } while (result.length < 3) { result.push(""); } return result.slice(0, 3); }
- 保存脚本(命名为
NameMerger即可),回到表格 - 在要生成结果的起始单元格(比如K2)输入公式:
=BYROW(A2:J, LAMBDA(r, mergeNamesToColumns(r))) - 公式会自动扩展到所有行,生成符合规则的3列结果
方法2:纯数组公式(无需脚本)
如果不想授权脚本,可直接使用以下数组公式(假设数据在A:J列),粘贴到结果起始单元格:
=BYROW(A:J, LAMBDA(r, LET( names, FILTER(r, r<>""), wordCounts, MAP(names, LAMBDA(n, LEN(n)-LEN(SUBSTITUTE(n," ",""))+1)), cumulative, SCAN(0, wordCounts, LAMBDA(a,c, IF(a+c>4, c, a+c))), groups, SCAN(1, cumulative, LAMBDA(g,c, IF(c=INDEX(wordCounts,ROW(c)-ROW(wordCounts)+1), g+1, g))), grouped, REDUCE({"","",""}, groups, LAMBDA(res, g, LET( idx, g-1, current, INDEX(res,idx+1), newVal, IF(current="", "("&TEXTJOIN(", ",TRUE,FILTER(names, groups=g))&")", current), IF(idx<3, ARRAYFORMULA(IF(SEQUENCE(3)=idx+1, newVal, res)), res) ) )), grouped ) ))
内容的提问来源于stack exchange,提问作者user1132149
相关产品推荐
相关产品推荐

