繁体   English   中英

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

[英]Google apps script getRange() range not found error

我觉得我正在以错误的方式来解决这个问题。 我试图在这里自动化一些工作量。 我正在清理具有4列(AE),超过2000行的电子表格。 B列包含网站URL,D列包含URL的公司名称,该名称是从另一个来源生成的。

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

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)在GAS文档中有些模糊,但是自定义函数有很多限制。 它们更适合需要执行简单计算并将字符串或数字类型值返回到单元格的情况。 尽管自定义函数可以调用某些GAS服务,但Google强烈建议不要这样做。

如果您在文档中查看受支持的服务列表,则会注意到它们仅支持电子表格服务的某些“获取”方法,而不支持https://developers.google.com/apps-script/guides的 “设置”方法/张/功能

这意味着您不能在自定义函数的上下文中调用cell.setValue()。 如果您考虑一下,这是有道理的-您的电子表格可以包含数千行,每个行都有自己的自定义函数,可以多次调用服务器。 在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);

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM