【发布时间】:2013-07-11 03:20:11
【问题描述】:
我正在尝试将“一对多关系”(如在数据库中)从一张表复制到另一张表(在同一个电子表格中)。
我对类似主题进行了研究,但似乎没有解决方案涵盖我。
本质上,原则上可以这样描述:
- 假设我们有一个存储元素的工作表 (PrimaryTable) 唯一(不重复)具有 pkElementID 列(主键)和一个
- 第二张表(SecondaryTable),其中每个元素的属性是 存储,根据它们对应的ElementID(还有 一个充当外键的 fkElementID 列)。
一些关于此的补充说明:
- PrimaryTable 包含 2000 多行,其中 SecondaryTable 的范围大致相同。
- 前面提到的SecondaryTable中的“属性”其实是 分布在几列中,这些列也通过 一个数组公式。
- 辅助表中的“报告”数据不是数字,而是 HTML 文本的大字符串(约 1000 个字符或更多),需要 加入。
- 公式应为数组公式,以便填充 随着更多行添加到工作表中,自动添加,最好是在 第一行的标题单元格,以便将其锁定。
所有这一切的一个例子是辅助表每一行的 HTML 代码(标签)内每个元素的几个图像的 url,报告给 PrimaryTable 中的相应单元格。
直到现在,在 Ted Juch 的博客上进行了一些讨论后,我找到了一个解决方案,并为此目的对公共电子表格做出了贡献,该电子表格使用了以下公式:
ArrayFormula(TRANSPOSE(SPLIT(CONCATENATE(REPT(TRANSPOSE('Secondary 表'!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))))
我怀疑大型数据集是否会产生如此大的数组,在谷歌电子表格的限制下无法正确处理,因此是问题的原因,或者是我搞砸了试图调整它的公式。
我还尝试使用 ArrayLib 库创建一个自定义函数,该库有一个名为 ArrayLib.filterByText 的类似函数,但它只运行几行,直到收到“错误:服务超时”消息。
我应该尝试实现一个查询方法吗? 有人可以帮忙吗?
【问题讨论】:
-
最重要的是,电子表格并不意味着代表一对多的关系。
-
@PeteBelford 我知道它不是 RDBMS,但我需要这个实现来通过谷歌融合表生成实时 KML 数据。
-
您总是可以尝试编写一个应用程序来确定另一个应用程序是否崩溃,或者编写一个正则表达式来确保有 n 个 a 后跟 n 个 b。
-
Adam 在这个板上也很活跃。我相信他和其他人能够就您的 Google Apps 脚本想法(使用 ArrayLib.filterByText 或其他)提供建议。你应该用 google-apps-script 标记这个问题。就个人而言,如果没有包含一些示例数据的示例电子表格以及成功运行的公式示例,我将无法进一步查看该问题,因此我们可以看到预期的输出并针对数据测试新想法 - 所以如果你可以提供一个电子表格的链接,那就太好了。
-
我在此处分享了上述文档的一个版本:docs.google.com/spreadsheet/…> 如果您觉得它像希腊语,那是因为它是希腊语!根据我的问题,我希望根据两个工作表中匹配的列 PinID 过滤从工作表“pinFEKs”中输入的行计算的第 I 列结果并报告回工作表“Pins”。请帮忙!!!
标签: javascript google-apps-script google-sheets