javascript - Google 电子表格中工作表之间的一对多报告

标签 javascript google-apps-script google-sheets

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

我已经对类似主题进行了研究,但似乎没有解决方案可以解决我的问题。

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

  • 假设我们有一个存储元素的工作表 (PrimaryTable) 唯一地(无重复)有一个 pkElementID 列(主键)和一个
  • 第二张表 (SecondaryTable),其中每个元素的属性是 存储起来,根据它们对应的ElementID(也有 作为外键的 fkElementID 列)。

关于此的一些补充说明:

  • PrimaryTable 由 2000 多行组成,其中 SecondaryTable 的范围大致相同。
  • 上述SecondaryTable中的“属性”其实就是 散布在几列中,这些列也由 一个数组公式。
  • 副表“上报”的数据不是数字,而是 HTML 文本的大字符串(~1000 个字符或更多),需要 加入。
  • 公式应该是一个数组公式,以便它被填充 随着更多的行被添加到工作表中,最好是在一个 第一行的标题单元格,以便可以将其锁定。

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

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

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

上面的公式是我认为来自 TC Adam 的建议,虽然我似乎已经了解它是如何工作的,但我几乎无法维护它或修改它以适应不同的情况。在最后一个例子中,它返回了一个“超出范围”的错误,并且不知道为什么。

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

ArrayFormula(IF(ROW(A1:A)=1;"Column Header"; TRANSPOSE(SPLIT(CONCATENATE(REPT(TRANSPOSE('Secondary Table'!B1:B&", ");(A1:A=TRANSPOSE('Secondary Table'!A1:A))*(LEN(A1:A)>0))&REPT(CHAR(9)&" "&CHAR(9);TRANSPOSE(ROW('Secondary Table'!A1:A))=ROWS('Secondary Table'!A1:A)));", "&CHAR(9);0))))

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

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

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

最佳答案

Here is the "best" solution I found for this (学分转到 Alexander Ivanov )

请注意,一对多关系不是以规范化的方式保存的,而是以序列化的方式保存的,但它确实开箱即用,并且可能会激发更多完整彻底的解决方案。

关于javascript - Google 电子表格中工作表之间的一对多报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617334/

相关文章:

mysql - MySQL查询错误“非法小时值”导致Google Apps脚本中的循环和写入问题

google-sheets - 如何使用 ARRAYFORMULA(Google 表格)过滤掉空白单元格

google-apps-script - Google Sheets 脚本按列排序然后按第 2 列排序

javascript - 在KendoUI中如何模仿Gmail的 "Swipe to delete"?示例包括

google-apps-script - 我可以使用 Google Visualization API 在应用程序脚本中查询电子表格吗?

email - 将事件工作表作为 PDF 发送到单元格中列出的电子邮件

google-sheets - 在 Google 电子表格中将 16 位数字格式化为 4 位数字组

javascript - 在 typescript 中获取函数名称

javascript - 确定是否指定了 "this"

javascript - 使用 Codemirror 的键盘映射防止默认事件发生