比原生的方式更快的方法。

适用场景

有大量的数据,或者动态的数据需要跨表引用。

优化思路

将需要引用的数据拆分成多个异步执行,或者引用限定的范围。

实例一

有一个 30 万的数据需要跨表引用。如果是常规的方法直接引用

=IMPORTRANGE("SheetID", "A1:A300000")

大约需要 12 秒左右。

把 30 万的数据平均拆成 10 份,每个引用 3 万的数据,并且用数组执行。

={
    IMPORTRANGE("SheetID", "A1:A30000");
    IMPORTRANGE("SheetID", "A30001:A60000");
    IMPORTRANGE("SheetID", "A60001:A90000");
    IMPORTRANGE("SheetID", "A90001:A120000");
    IMPORTRANGE("SheetID", "A120001:A150000");
    IMPORTRANGE("SheetID", "A150001:A180000");
    IMPORTRANGE("SheetID", "A180001:A210000");
    IMPORTRANGE("SheetID", "A210001:A240000");
    IMPORTRANGE("SheetID", "A240001:A270000");
    IMPORTRANGE("SheetID", "A270001:A300000")
}

因为 IMPORTRANGE 函数是异步运行,所以并不会等待前面的结果计算完成后再运行下一个 IMPORTRANGE,而是在执行的过程中继续往下运行。大于需要 9 秒左右,相比常规的跨表引用速度要快。

实例二

有一个动态的内容需要跨表引用,数据会随时增加或者删减。因为数据长度的未知性,就需要引用更多的单元格或者引用一整列,确保增加数据的时候依然在引用的范围内,这样同时也会造成一个问题,会引用更多空白的单元格,造成没必要的性能消耗。

先使用 COUNTA 计算数据的长度,因为数据在第二行,所以需要将数据计算的结果再加一才能保持数据长度一致。

在另外一个工作表先用 IMPORTRANGE 引用数据的长度,也就是 COUNTA 计算的结果。然后引用范围从第二行开始,结束的行设置成计算好的数据长度。这样不管在数据源怎么变动数据,都可以将数据的长度同步到当前的表格,并且只引用需要的范围,这样要比一整列引用数据要小得多。