与 ARRAYFORMULA 一起使用的自定义表格函数
Custom Sheets function to be used with ARRAYFORMULA
我正在尝试将以下自定义函数 DrivingKms
与 ARRAYFORMULA
一起使用,以便它递归计算指定列的距离。
我如何更新它才能与 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:F
和M2: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 中使用以上脚本。
参考文献:
我正在尝试将以下自定义函数 DrivingKms
与 ARRAYFORMULA
一起使用,以便它递归计算指定列的距离。
我如何更新它才能与 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:F
和M2: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 中使用以上脚本。