找不到方法getRange(number,(class),number)

时间:2017-08-28 13:11:16

标签: google-apps-script google-sheets

我已经阅读了有关此错误的所有答案,但它们都不适用于我。所以也许有人有另一个想法。

我正在尝试将参数传递给函数getRange但是当我尝试调用此函数时它会显示错误

  

找不到方法getRange(number,(class),number)

这是我的代码:

function conditionalCheck(color,rangeCondition, rangeSum, criteria){

 var condition = SpreadsheetApp.getActiveSheet().getRange(2,rangeCondition,15).getValues();
 var val = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(2,rangeSum,15).getValues();
 var bg = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(2,rangeSum,15).getBackgrounds();
 var sum = 0;

  for(var i=0;i<val.length;i++){
    if(condition[i][0] == criteria && bg[i][0] != color){
    sum += val[i][0];
    }
  }
  return sum;
}

我传递了一个自定义函数,如:

  

conditionalCheck( “#FFFF00”,1,3,A3)

这是工作表的样子: This is how the sheet looks like

我理解JS试图猜测参数的类型,这就是为什么它认为ex。 “rangeCondition”是一个类,但我不知道如何给他一个数字类型。

有趣的是,这个功能在我打开电子表格时有效,但是当我在工作时尝试调用此功能时,它会向我显示此错误。因此,要更新表格,我必须重新打开整个电子表格。

2 个答案:

答案 0 :(得分:2)

我能够通过直接从编辑器执行该功能来重现错误。

enter image description here

这种行为很有意义,考虑到自定义函数需要接收有效参数。在运行时,您的&#39; rangeSum&#39;参数设置为&#39; undefined&#39;,它使getRange()方法无效,因为它需要一个数字。

你真的很奇怪你得到了&#39; for&#39;循环工作。在大多数情况下,使用&#39; +&#39;从工作表中获取的数组值的运算符会将它们连接成一个字符串,因此您将得到“5413”&#39;&#39;而不是13(5 + 4 + 1 + 3)

function calculateSum(column) {

column = column||1;  //set the default column value to 1

var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange(1, column, sheet.getLastRow());
var values = range.getValues();

var sum = 0;

  for (var i=0; i < values.length; i++) {

    sum += parseInt(values[i]);


  }

  return sum;

}

最后,这种方法在性能方面效率不高。获得对象的实例后,您应该使用该实例,而不是像在代码的前3行中那样使用多个调用来攻击服务器。例如

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getRange(1, 1, sheet.getLastRow(), 1);

如果您打算在工作表中的多个位置使用此自定义函数,请考虑将其替换为处理整个范围的脚本 - 这样您将只执行单个读取和写入操作来更新所有值。否则,您可能会很快填写服务电话配额

<强>更新

创建一个占用整个范围并在一次调用中处理所有数据的函数,而不是创建自定义函数。你可以测试&#39; calculateSum()&#39;具有预定义列号的上述函数,例如

var column = 1 // the column where you get the values from

获得&#39;总和&#39;值,将其写入目标范围

var targetRange = sheet.getRange("B1"); // the cell that you write the sum to

targetRange.setValue(sum);

最后,您可以在打开或编辑工作表后通过附加以下代码

来执行该功能
function onOpen() {

    var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('Menu')
.addItem('Calculate sum', 'calculateSum')
.addToUi();

   calculateSum();
}


function onEdit() {
  calculateSum();

}

从自定义菜单调用它很简单 - 您只需要创建处理程序并将函数名称作为参数传递。

答案 1 :(得分:1)

我找到了一个解决更改数据后重新加载自定义函数的问题的解决方案。

此处描述了解决方案: Refresh data retrieved by a custom function in google spreadsheet

它表明如果我们不更改输入的参数,我们就无法刷新自定义函数,因为它是缓存的。因此,如果我们更改输入的数据,函数将重新加载。如果我们把时间戳放在那里,我们可以强制执行一个函数