具有给定范围和参数的自定义函数-谷歌应用程序脚本



我有一个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).

我尝试过测试,以下是返回值:

  1. Return range.length6
  2. Return range[0][a]Squat
  3. 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行。

修改:

我对你的脚本做了以下更改:

  1. 您可以使用=loopMovement(Squat,Competition,Sheet1!A$2:E$7,0,1,4)1而不是使用硬拷贝值10以获取给定范围的总行数。

  2. 公式中的movementvariation必须作为字符串传递

    =loopMovement("Squat","Competition",...)
    
  3. 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);
    });
    
  4. 表达式CCD_ 18返回具有所需值的字符串。但是,您想要构造一个数字数组,因此需要使用parseFloat((:将其转换为浮点数(假设它可能包含小数(

    parseFloat(range[i][c])
    

最新更新