未找到Google应用脚本getRange()范围错误

时间:2017-08-13 00:00:34

标签: javascript google-apps-script google-sheets

我觉得我会以错误的方式解决这个问题。我正在尝试自动化我的一些工作量。我正在清理4列(A-E),2000多行的电子表格。 B列包含网站URL,D列包含从其他来源生成的URL的业务名称。

有时,该工具没有正确获取名称或缺少名称,因此它使用“------”(6个连字符)填充D列中缺少的条目。我一直在尝试创建一个带有输入单元格的函数,检查单元格的内容是否为“------”,如果是函数则将输入单元格的内容更改为内容单元格左侧两列(通常是网站URL)。这就是我想出来的。

function replaceMissing(input) {
    var sheet = SpreadsheetApp.getActiveSheet();
    //sets active range to the input cell
    var cell = sheet.getRange('"' + input + '"');
    //gets cell to fill input cell
    var urlCell = sheet.getRange(cell.getRow(), cell.getColumn() - 2);
    //gets contents of input cell as String
    var data = cell.getValue(); 
    //gets contents of urlCell as String
    var data2 = cell.getValue();


    //checks if input cell should be replaced
    if (data === "------") { 
      //set current cell's value to the value of the cell 2 columns to the left
      cell.setValue(data2);
    }
}

当我尝试在工作表中使用我的功能时,单元格将返回错误

Error Range not found (line 4).

我假设,根据人们提出的类似问题,这就是你如何使用带参数的函数的A1表示法。然而,情况似乎并非如此,所以我被困住了。我也不认为我的解决方案是非常好的时期。

1 个答案:

答案 0 :(得分:2)

1)GAS文档中有些模棱两可,但自定义函数有很多限制。它们更适合于需要执行简单计算并将字符串或数字类型值返回到单元格的情况。虽然自定义功能可以调用某些GAS服务,但Google强烈建议不要采用这种做法。

如果您查看支持服务列表的文档,您会注意到它们仅支持某些' get'电子表格服务的方法,但没有设置'方法https://developers.google.com/apps-script/guides/sheets/functions

这意味着您无法在自定义函数的上下文中调用cell.setValue()。如果你考虑它就有意义了 - 你的电子表格可以包含1000行,每行都有自己的自定义函数,可以多次调用服务器。在JavaScript中,每个函数调用都会创建自己的执行上下文,因此事情会很快变得丑陋。

2)为了获得更好的性能,请使用批处理操作,不要在读/写操作之间切换。相反,请阅读处理变量所需的所有数据,并单独保留电子表格。处理完数据后,执行单个写入操作以更新目标范围内的值。当您可以使用GAS获得整个范围时,无需逐个单元格。

Google Apps脚本 - 最佳做法 https://developers.google.com/apps-script/guides/support/best-practices

下面是一个在onOpen和onEdit上运行的快速代码示例。如果您在何时运行脚本方面需要更多灵活性,请查看动态创建的触发器https://developers.google.com/apps-script/reference/script/script-app 因为您的电子表格有很多行,所以无论如何您都可以达到执行配额 - 通过使用触发器,您可以解决限制。

最后,如果一个包含' ----'这种情况很少见,最好创建另一个数组变量,其中包含要更新的新值和行号,而不是更新整个范围。 就个人而言,我认为单一范围更新操作仍然会更快,但您可以尝试这两种方法,看看哪种方法效果最佳。

function onOpen(){

 test();


}

function onEdit() {

 test();

}


function test() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('yourSheetName');

  //range to replace values in
  var range = sheet.getRange(2, 4, sheet.getLastRow() - 1, 1);

  //range to get new values from
  var lookupRange = range.offset(0, -2);

  //2d array of values from the target range
  var values = range.getValues();
  //2d array of values from the source range
  var lookupValues = lookupRange.getValues();   

  //looping through the values array and checking if array element meets our condition
  for (var i=0; i < values.length; i++) {

      values[i][0] = (values[i][0] == '------') ? lookupValues[i][0] : values[i][0];

  }

  // one method call to update the range
  range.setValues(values);

}