如何使用 Google 电子表格上的公式复制字符串并附加数字后缀?

Posted

技术标签:

【中文标题】如何使用 Google 电子表格上的公式复制字符串并附加数字后缀?【英文标题】:How to duplicate strings and attach the numeric suffix using formulas on Google Spreadsheet? 【发布时间】:2021-12-29 19:19:56 【问题描述】:

我在一个单元格中的每一行都有字符串。 # 后面的数字表示项目的数量。 如果您在 A 单元格中输入字符串(如附加图像),是否可以在 Google 电子表格上编写一个公式,让您像 B 单元格一样进行处理? 我尝试将 JOIN、SPLIT、ARRAYFORMULA 和 SUBSTITUTE 等公式组合在一起,但失败了。我应该学习查询吗?

【问题讨论】:

【参考方案1】:

确定:

=INDEX(TEXTJOIN(CHAR(10), 1, IF(""=SPLIT(REPT(
 INDEX(SPLIT(FLATTEN(SPLIT(A1, CHAR(10))), "#"),,1)&"-×", 
 INDEX(SPLIT(FLATTEN(SPLIT(A1, CHAR(10))), "#"),,2)), "×"),,SPLIT(REPT(
 INDEX(SPLIT(FLATTEN(SPLIT(A1, CHAR(10))), "#"),,1)&"-×", 
 INDEX(SPLIT(FLATTEN(SPLIT(A1, CHAR(10))), "#"),,2)), "×")&
 TEXT(SEQUENCE(1, 1000), "00"))))


或数组公式:

=INDEX(SUBSTITUTE(SUBSTITUTE(TRIM(IFNA(VLOOKUP(ROW(A1:A5), SPLIT(TRIM(FLATTEN(
 QUERY(SUBSTITUTE(QUERY(IFERROR(SPLIT(FLATTEN(IF(""=IFERROR(SPLIT(REPT(
 INDEX(SPLIT(FLATTEN(SPLIT(A1:A5, CHAR(10))), "#"),,1)&"-×", 
 INDEX(SPLIT(FLATTEN(SPLIT(A1:A5, CHAR(10))), "#"),,2)), "×")),,SPLIT(REPT(
 INDEX(SPLIT(FLATTEN(ROW(A1:A5)&"♠♦"&SPLIT(A1:A5, CHAR(10))), "#"),,1)&"-×", 
 INDEX(SPLIT(FLATTEN(SPLIT(A1:A5, CHAR(10))), "#"),,2)), "×")&
 TEXT(SEQUENCE(1, 100), "00"))), "♦")), 
 "select max(Col2) where Col1 is not null group by Col2 pivot Col1"), 
 " ", CHAR(13)),,9^9))), "♠"), 2, 0))), " ", CHAR(10)), CHAR(13), " "))

【讨论】:

它非常适合我的情况。我彻夜未眠,但我无法做到。你有什么写长公式的技巧吗?你会一次写出所有的公式吗?或者你是否在单元格之间划分步骤进行调试,最后将它们组合成一个公式? @J.SungHoon 取决于公式,但大多数情况下(就像在这种情况下)我从中间开始并像洋葱层一样添加它,并且检查每一步是否在最后保持 coz组装公式时,如果某个地方需要修复,我几乎会迷失方向。这个公式可以被认为是很小的一个:) 与webapps.stackexchange.com/a/125018/186471 相比 我去了链接页面,看了第5步,下巴掉到了地上。太有趣了。谢谢你帮助我。 @J.SungHoon 如果您对公式汇编的示例感兴趣:docs.google.com/spreadsheets/d/…【参考方案2】:

假设您要对范围 A2:A 中的多个数据单元格执行此操作。清除 B2:B 并将以下公式放入 B2:

=ArrayFormula(IF(A2:A="",,IFERROR(TRIM(SUBSTITUTE(SUBSTITUTE(TRIM(TRANSPOSE(QUERY(TRANSPOSE(REPT(REGEXEXTRACT(SPLIT(A2:A,CHAR(10)),"[^#))]+")&"~",REGEXEXTRACT(SPLIT(A2:A,CHAR(10)),"#(\d+)")*1)),,COLUMNS(SPLIT(A2:A,CHAR(10)))))),"~ ","~"),"~",CHAR(10))))))

此公式应为 A2:A 包含数据的所有行生成所有结果。

如果您只想处理 一个 单元格(例如 A2),您可以在 B2 中使用此版本:

=ArrayFormula(IFERROR(TRIM(SUBSTITUTE(SUBSTITUTE(TRIM(TRANSPOSE(QUERY(TRANSPOSE(REPT(REGEXEXTRACT(SPLIT(A2,CHAR(10)),"[^#))]+")&"~",REGEXEXTRACT(SPLIT(A2,CHAR(10)),"#(\d+)")*1)),,COLUMNS(SPLIT(A2:A,CHAR(10)))))),"~ ","~"),"~",CHAR(10)))))

附录(在 cmets 之后):

OP 意识到我已经放弃了数字的排序。这无疑让事情变得相当棘手。但是,我能够编写一个应该可以工作的数组公式。

再次假设原始数据运行A2:A,清除B2:B,然后将以下内容放入单元格B2:

=ArrayFormula(REGEXREPLACE(REGEXREPLACE(TRANSPOSE(QUERY(TRANSPOSE(REGEXREPLACE(IFERROR(VLOOKUP(SEQUENCE(ROWS(A2:A))&"^"&SEQUENCE(1,COLUMNS(SPLIT(A2:A,CHAR(10))))&"*",TRANSPOSE(QUERY(TRANSPOSE(REGEXREPLACE(SPLIT(QUERY(FLATTEN(FILTER(IFERROR(SEQUENCE(ROWS(A2:A))&"^"&SEQUENCE(1,COLUMNS(SPLIT(A2:A,CHAR(10))))&"^"&REPT(REGEXEXTRACT(SPLIT(A2:A,CHAR(10)),"[^#))]+")&"~",REGEXEXTRACT(SPLIT(A2:A,CHAR(10)),"#(\d+)")*1)),A2:A<>"")),"Select * WHERE Col1 Is Not Null"),"~")&TEXT(SEQUENCE(1,MAX(IFERROR(SPLIT(REGEXREPLACE(A2:A,"[^#\d]",""),"#",1)))),"00")&"~","^\d+~$","")),,MAX(IFERROR(SPLIT(REGEXREPLACE(A2:A,"[^#\d]",""),"#",1))))),1,FALSE)),"^\d+\^\d+\^","")),,COLUMNS(SPLIT(A2:A,CHAR(10))))),"~\s*$",""),"~\s*",CHAR(10)))

很长吗?当然。它有效吗?是的,它应该。而且作为一个数组公式,它实际上节省了处理,并且无需在 A2:A 中添加新的数据行时向下拖动公式。

【讨论】:

拆分、重复和重新加入字符串很好。但是,似乎没有关于数字后缀的公式。 是的,我似乎错过了请求的那一部分。如果我有时间,我会再研究一下。与此同时,player0 似乎为你提供了一个有效的公式。 有关数组解决方案,请参阅我的帖子的“附录”。 你的公式也很好用!比较遗憾的是,即使将公式中的00改成-00修饰后缀的形式,如果A2单元格输入data#2,A3单元格输入data#5data-00data-01 , 和data-02 打印在B2 中,并添加了不必要的-03-04-05。但目前的公式也很酷。我想稳步学习,以便我可以自己添加我需要的要求。谢谢你的帮助。 我不明白你的扩展目标。 (或者,我应该说,我没有时间分析扩展目标以进行理解。)事实上,所提供的解决方案需要的时间比我通常可以在给定一周内回复所有帖子所花费的时间要多得多。但我很高兴它至少让你深思。也许在分析这里提供的解决方案后,您可以自己管理扩展它们的应用程序。祝你好运。

以上是关于如何使用 Google 电子表格上的公式复制字符串并附加数字后缀?的主要内容,如果未能解决你的问题,请参考以下文章

自动填充公式(跨电子表格运行) - Google 表格/应用程序脚本

带有自定义脚本的公式不会在 Google 电子表格中更新

无法在Google文档电子表格中找出现值(PV)公式

谷歌电子表格和谷歌应用引擎如何实现交互

自定义公式 Google 电子表格

检索 Google 表格公式的行号