根据列表中一列表格链接和一列引用范围使用 IMPORTRANGE 引用数据并且数组输出。


例如表格内 A 列是表格链接,B 列是引用范围。

那么常规的方法一般会使用 {}(大括号),把内容合并为数组输出。

={
  IMPORTRANGE(A1, B1);
  IMPORTRANGE(A2, B2)
}

虽然也可以实现这个效果,但是引用的范围是静态的,当列表中增加或者删减需要引用的表格链接和范围,那么就需要手动更改函数。

解决方法

=WRAPROWS(
  TOROW(MAP(
    A1:A2, B1:B2, 
    LAMBDA(
      ssUrl, ssRange, 
      TOROW(
        IFERROR(IMPORTRANGE(ssUrl, ssRange))
      )
    )
  ))
, 5)

原理分析

这里使用了 LAMBDA 和 MAP 组合函数,把引用的 A 列和 B 列在 LAMBDA 函数中分别自定义 ssUrl 和 ssRange 变量,这两个变量分别对应表格链接和引用范围。然后再把这两个变量的值传入 IMPORTRANGE 函数中。

=MAP(A1:A2, B1:B2, LAMBDA(ssUrl, ssRange, IMPORTRANGE(ssUrl, ssRange)))

但是直接这么使用的话函数会出错,因为 LAMBDA 函数只支持单行输出,而 IMPORTRANGE 引用的数据是一整个范围的。

所以需要把 IMPORTRANGE 引用的数据转换成行。这里用到 TOROW 函数,作用是将一个数组或者一个范围的数据转换成单行。

=MAP(A1:A2, B1:B2, LAMBDA(ssUrl, ssRange, TOROW(IMPORTRANGE(ssUrl, ssRange))))

因为列表中 A 列的表格链接有两个,虽然刚才把 IMPORTRANGE 输出的结果转换成单行了,但是有两个链接,所以会输出两行的数据,需要再次使用 TOROW 函数把所有数据都转换成单行。

=TOROW(MAP(A1:A2, B1:B2, LAMBDA(ssUrl, ssRange, TOROW(IMPORTRANGE(ssUrl, ssRange)))))

现在已经把所有的数据都引用过来了,需要把数据的格式还原。这里用到 WRAPROWS 函数,将数据按照指定的列数拆分并且换行。

在列表中 B 列引用的范围是 A 到 E 列,这个范围一共有 5 列,那么在 WRAPROWS 函数中第二个参数需要设置 5,意思是每 5 列将数据换行。

=WRAPROWS(TOROW(MAP(A1:A2, B1:B2, LAMBDA(ssUrl, ssRange, TOROW(IMPORTRANGE(ssUrl, ssRange))))), 5)

这样就实现了 IMPORTRANGE 数组输出,只需要在列表中 A 列和 B 列修改表格链接和引用范围就可以自动根据这些范围引用内容。

如果想去掉引用数据的空行,可以使用 QUERY 函数筛选非空行,例子如下。

=QUERY(
  WRAPROWS(
    TOROW(MAP(
      A1:A2, B1:B2, 
      LAMBDA(
        ssUrl, ssRange, 
        TOROW(IMPORTRANGE(ssUrl, ssRange)))
      )
    )
  , 5)
, "select * where Col1 is not null")

相关推荐:
Google Excel 性能优化 - 跨表引用
Google Excel 动态获取表格名称