3

我正在尝试将“一对多关系”(如在数据库中)从一张纸复制到另一张纸(在同一个电子表格中)。

我已经对类似主题进行了研究,但似乎没有解决方案涵盖我。

本质上,这在原则上可以描述如下:

  • 假设我们有一个工作表(PrimaryTable),其中元素以 pkElementID 列(主键)唯一存储(无重复),以及
  • 第二张表 (SecondaryTable) 存储每个元素的属性,根据它们对应的 ElementID(还有一个 fkElementID 列充当外键)。

关于此的一些补充说明:

  • PrimaryTable 由 2000 多行组成,其中 SecondaryTable 的范围大致相同。
  • SecondaryTable 中的上述“属性”实际上分布在多个列中,这些列也通过数组公式连接到一列中。
  • 辅助表中的“报告”数据不是数字,而是需要连接的 HTML 文本的大字符串(约 1000 个字符或更多)。
  • 该公式应该是一个数组公式,以便在将更多行添加到工作表时自动填充它,最好是在第一行的标题单元格中,这样它就可以被锁定。

所有这一切的一个例子是 HTML 代码(标签)内每个元素的几个图像的 URL,用于辅助表的每一行,报告给 PrimaryTable 中的相应单元格。

到目前为止,在 Ted Juch 的博客上进行了一些讨论并为此目的对公共电子表格做出贡献后,我找到了解决方案,该电子表格使用以下公式:

ArrayFormula(TRANSPOSE(SPLIT(CONCATENATE(REPT(TRANSPOSE('二级表'!B1:B&", ");(A1:A=TRANSPOSE('二级表'!A1:A)))*(LEN(A1:A) >0))&REPT(CHAR(9)&" "&CHAR(9);TRANSPOSE(ROW('二级表'!A1:A))=ROWS('二级表'!A1:A)));", " &CHAR(9);0)))

上面的公式是我认为来自 TC Adam 的建议,虽然我似乎已经了解它的工作原理,但我几乎无法维护它或根据不同的情况对其进行修改。在最后一个示例中,它返回“超出范围”的错误并且无法弄清楚原因。

我对公式所做的唯一修改是在初始数组公式中添加“if (row(A1:A)=1;"Column Header"; FORMULA)”,结果是:

ArrayFormula(IF(ROW(A1:A)=1;"列标题"; TRANSPOSE(SPLIT(CONCATENATE(REPT(TRANSPOSE('二级表'!B1:B&", ");(A1:A=TRANSPOSE('二级表'!A1:A))*(LEN(A1:A)>0))&REPT(CHAR(9)&" "&CHAR(9);TRANSPOSE(ROW('辅助表'!A1:A))=ROWS ('辅助表'!A1:A)));", "&CHAR(9);0))))

我怀疑大型数据集是否会产生如此大的数组,在 Google 电子表格的限制下无法正确处理,因此是问题的原因,或者是我搞砸了试图调整它的公式。

我还尝试使用 ArrayLib 库创建一个自定义函数,该库有一个名为 ArrayLib.filterByText 的类似函数,但它只运行几行,直到收到“错误:服务超时”消息。

我应该尝试实现查询方法吗?有人可以帮忙吗?

4

1 回答 1

0

这是我为此找到的“最佳”解决方案(感谢Alexander Ivanov

请注意,一对多关系不是以标准化方式保存的,而是以序列化方式保存的,但它确实可以开箱即用,并且可能会成为更完整和彻底解决方案的灵感。

于 2014-08-23T09:54:31.107 回答