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

将10列姓名数据按指定规则合并为3列的技术问询

将10列姓名合并为3列的实现方案

需求规则

  • 每组合并列的首个姓名前加(,最后一个姓名后加),姓名间用逗号分隔
  • 每列最多包含4个单词,超出则转入下一列
  • 禁止拆分完整姓名:若当前列已有3个单词,无法加入双词姓名(会超4个上限),则当前列截止,下一列从该双词姓名开始

示例输入与输出

输入(每行10列姓名)

列1列2列3列4列5列6列7列8列9列10
AliceBob SmithCharlieDaveEveFrank LeeGraceHenryIrisJack
Evan HillFionaGeorgeHelenIanJane DoeKevinLilyMikeNora

预期输出(每行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脚本(推荐,灵活易维护)

  1. 打开你的Google表格,点击「扩展程序」→「Apps Script」
  2. 清空默认代码,粘贴以下脚本:
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);
}
  1. 保存脚本(命名为NameMerger即可),回到表格
  2. 在要生成结果的起始单元格(比如K2)输入公式:
    =BYROW(A2:J, LAMBDA(r, mergeNamesToColumns(r)))
  3. 公式会自动扩展到所有行,生成符合规则的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:40:11