【问题标题】:Custom function with given range and arguments - Google Apps Script具有给定范围和参数的自定义函数 - Google Apps 脚本
【发布时间】:2020-12-13 06:33:05
【问题描述】:

我有一个 Google 表格: Sheet 1 data table

还有这个功能:

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 中的单元格:=loopMovement(Squat,Competition,Sheet1!A$2:E$7,0,1,4)。但是我在该行返回了一个错误:if (range[i][a]===movement &amp;&amp; range[i][b]===variation){:TypeError: Cannot read property '0' of undefined (line 8).

我试过测试,这里是返回值:

  1. Return range.length: 6
  2. Return range[0][a]: Squat
  3. Return range[0][c]: 110

【问题讨论】:

    标签: javascript google-apps-script 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 = 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. 您可以使用range.length,而不是使用硬拷贝值10 获取给定范围的总行数。

    2. 公式中的

      movementvariation 必须作为字符串传递:

      =loopMovement("Squat","Competition",...)
      
    3. Math.max() 不接受数组作为参数。为了 例如,Math.max(1,5,2) 返回5,但Math.max([1,5,2]) 返回NaN

      Array.reduce() 可用于查找a中的最大元素 数值数组:

      var maxProjection = arr.reduce(function(a, b) {
      return Math.max(a, b);
      });
      
    4. 表达式range[i][c] 返回具有所需值的字符串。但是,您想要构造一个数值数组,因此您需要使用parseFloat() 将其转换为浮点数(假设它可能包含小数):

      parseFloat(range[i][c])
      

    【讨论】: