找不到方法getRange(数字,数字,数字,(类))

时间:2014-10-23 18:47:12

标签: google-apps-script google-sheets

只想创建简单的填充物以在其他功能中使用它:

function fillLine(row, column, length, bgcolor)
{
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(1+row, 1+column, 1, length).setBackground(bgcolor)
}

但得到:“找不到方法getRange(数字,数字,数字,(类))”。

是否可以创建一个?

添加了23.10.2014 23:32 GMT + 2

我试图自己运行功能。检查了运行菜单中的选项“fillLine”。当我将其更改为我的主要功能“onOpen”时,一切正常。对于else函数,即使没有参数,我也可以运行它们,但不能用于此函数。也许有人可以解释一下?

3 个答案:

答案 0 :(得分:3)

您在调试器中使用NO参数运行此操作。如果你想这样做,你需要确保在使用参数之前定义了适当的默认值,否则解释器将开始猜测。

如果参数为空,这将为您解决问题:

function fillLine(row, column, length, bgcolor)
{
  row = row || 0;
  column = column || 0;
  length = length || 1;
  bgcolor = bgcolor || "red";
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(1+row, 1+column, 1, length).setBackground(bgcolor)
}

或者,您可以使用这样的测试函数,并从调试器中调用 it

function test_fillLine() {
  fillLine(0, 0, 1, 'red');
}

还有其他方法,有些在Is there a better way to do optional function parameters in Javascript?

中描述

那是怎么回事?

未明确键入Javascript参数。因此,解释器必须在运行时检查传递的对象以确定它们的类型。

在此示例中,未传递任何参数,所有参数都设置为undefined值,并且未定义'未定义'类型。

当调用函数时,解释器需要确定有时几个签名适用于哪一个。 (Sheet.getRange有4种变体。)为此,它必须解决所提供参数的数量和类型。

所以,我们走了......

  • 1+row1+column被标识为数字,因为文字" 1"是一个数字。
  • 1显然是一个数字
  • length是一个未定义的对象,没有任何其他对象提供提示,解释器认为它是普通的class

因此,解释器决定需要找到带有签名getRange的{​​{1}}对象的sheet方法。它没有找到,并抛出你看到的异常。

答案 1 :(得分:1)

我成功使用了偏移。

var sheet = SpreadsheetApp.getActiveSheet()
//var range = sheet.getRange(row, column, height, width)
var range = sheet.getRange('A1').offset(row - 1, column - 1, height, width)

因此,在您的情况下,可能会运行以下代码。

function fillLine(row, column, length, bgcolor) {
  var sheet = SpreadsheetApp.getActiveSheet()
  //var range = sheet.getRange(row, column, 1, length)
  var range = sheet.getRange('A1').offset(row - 1, column - 1, 1, length)
  range.setBackground(bgcolor)
}

就我而言,我需要添加权限才能使用setBackground。 当我以@Mogsdad said运行测试脚本时,脚本编辑器中会出现一个添加权限的弹出菜单。

function test_fillLine() {
  fillLine(1, 1, 2, 'red');
}

enter image description here

https://developers.google.com/apps-script/guides/services/authorization

答案 2 :(得分:0)

你必须浏览 activeSpreadsheet ,其中 activeSheet 是“嵌入”的,i。即

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

intead of

var sheet = SpreadsheetApp.getActiveSheet();