我试图在编辑时运行一个函数,该函数将在一系列单元格中查找值“ c”,然后将其替换为“ Closed”一词。

这是我到目前为止所拥有的:

function onEdit(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getRange('CA12:CA15').getValues();
  var closed = 'c'
  for(var i=0; i<data.length;i++) {
  if(data[i] == closed) {

    Logger.log('yes')
    Logger.log(data[i]);
  }
    }
  }


因此,当我具有给定范围内的值时,这将成功记录“是”和值“ c”。但是,现在如何替换该值?

我尝试使用getRange()存储data [i]的范围,但是它不允许我这样做。如果我能得到这个范围,那我就可以使用range.setValue('Closed'),但此刻有点卡住了。我知道我在做一些非常简单非常错误的事情,但是任何帮助都会很棒。

最佳答案

关键点:


getValues返回按行然后按列排序的二维数组。您正在使用data[i]访问一维数组
i数组+起始行的索引等于循环中的当前行。


代码段(慢):

if(data[i][0] == closed) { //2D
 sheet.getRange('CA'+(12+i)).setValue('Closed');
}



但是上述过程很慢,因为我们为每个真实条件调用setValue()。更好的方法是使用数组。


代码段(快速70x):

var rng =sheet.getRange('CA12:CA15');
var data = rng.getValues();
var output = data.map(function(e) { return e[0] == closed ? ['Closed'] : e });
rng.setValues(output); //Single call



最快的方法是通过表格UI或API使用查找和替换


基本阅读:


Best Practices
Array#map
2D array
FR API request

10-04 21:59
查看更多