我有一个Google Sheets表:表1数据表
这个功能:
function loopMovement(movement, variation, range, a, b, c) {
let arr = [];
let projection = null;
for (let i=0; I<=range.length; i++) {
if (range[i][a]===movement && range[i][b]===variation){
projection = range[i][c];
arr.push(projection);
let maxProjection = Math.max(arr);
}
}
return maxProjection;
}
这是我在表2:CCD_ 1中的单元格。然而,我在以下行中返回了一个错误:if (range[i][a]===movement && range[i][b]===variation){
:TypeError: Cannot read property '0' of undefined (line 8).
我尝试过测试,以下是返回值:
Return range.length
:6
Return range[0][a]
:Squat
Return range[0][c]
:110
解决方案:
function loopMovement(movement, variation, range, a, b, c) {
let arr = [];
let projection = null;
for (let i=0; i<range.length; i++) {
if (range[i][a]===movement && range[i][b]===variation){
projection = parseFloat(range[i][c]);
arr.push(projection);
}
}
var maxProjection = arr.reduce(function(a, b) {
return Math.max(a, b);
});
return maxProjection;
}
并使用这样的自定义功能:
=loopMovement("Squat","Competition",Sheet1!A$2:E$7,0,1,4)
错误:
您得到的错误消息:
TypeError:无法读取未定义的属性"0">
与for循环遍历空行这一事实有关。根据您的屏幕截图,除标题外共有6行。但是,for循环会迭代到第10行。
修改:
我对你的脚本做了以下更改:
您可以使用
=loopMovement(Squat,Competition,Sheet1!A$2:E$7,0,1,4)
1而不是使用硬拷贝值10
以获取给定范围的总行数。公式中的
movement
和variation
必须作为字符串传递:=loopMovement("Squat","Competition",...)
Math.max((不接受数组作为参数。对于例如,
Math.max(1,5,2)
返回5
,但返回Math.max([1,5,2])
返回CCD_ 17。Array.reduce((可用于查找数字数组:
var maxProjection = arr.reduce(function(a, b) { return Math.max(a, b); });
表达式CCD_ 18返回具有所需值的字符串。但是,您想要构造一个数字数组,因此需要使用parseFloat((:将其转换为浮点数(假设它可能包含小数(
parseFloat(range[i][c])