与 ARRAYFORMULA 一起使用的自定义表格函数

Custom Sheets function to be used with ARRAYFORMULA

我正在尝试将以下自定义函数 DrivingKmsARRAYFORMULA 一起使用,以便它递归计算指定列的距离。

我如何更新它才能与 ARRAYFORMULA 一起使用?

function DrivingKms(origin, destination) {
  
  return DrivingMeters(origin, destination)/1000;
}

function DrivingMeters(origin, destination) {
  var directions = Maps.newDirectionFinder()
  .setOrigin(origin)
  .setDestination(destination)
  .getDirections();
  return directions.routes[0].legs[0].distance.value;
}

当我在 ARRAYFORMULA 中调用函数时,从头到尾,它只转换前两个位置点(F2 和 M2)。

={"DrivingKms";ARRAYFORMULA(IF(ISBLANK(A2:A),"",drivingkms(F2:F, M2:M)))}

我相信你的目标如下。

  • 您想将 DrivingKms={"DrivingKms";ARRAYFORMULA(IF(ISBLANK(A2:A),"",drivingkms(F2:F, M2:M)))} 一起使用。

为此,我想提出以下修改脚本。

修改点:

  • 在你的脚本中,我认为 DrivingMeters 是正确的。但是当 DrivingKms={"DrivingKms";ARRAYFORMULA(IF(ISBLANK(A2:A),"",drivingkms(F2:F, M2:M)))} 一起使用时,只使用第一个元素。我认为这就是您遇到问题的原因。
  • 当使用drivingkms(F2:F, M2:M)时,F2:FM2:M分别是二维数组。在你的情况下,需要考虑这一点。

模式 1:

在此模式中,结果值在循环中检索。请修改DrivingKms如下。

修改后的脚本:

function DrivingKms(origin, destination) {
  return origin.map(([v], i) => [v && destination[i][0] ? DrivingMeters(v, destination[i][0]) / 1000 : ""]);
}

模式二:

在此模式中,从 recursively calculates the distance down the specified columns. 开始,在递归循环中检索结果值。为此,首先创建 values 用于在 calc 处使用。请修改DrivingKms如下。

修改后的脚本:

function DrivingKms(origin, destination) {
  const calc = (values) => values.map ? values.map(calc) : DrivingMeters(...values.split(",")) / 1000;
  return calc(origin.map(([v], i) => [v, destination[i][0]].join(",")).filter(([a, b]) => a && b));
}

注:

  • 请在 V8 中使用以上脚本。

参考文献: