在Google表格中查找整个工作表的最佳方式

时间:2016-09-26 21:35:15

标签: replace google-apps-script google-sheets find

我想创建一个需要查找某个字符串并自动替换它的脚本。我已设法做到这一点,但需要超过1分钟才能查看所有行和列。

这就是我现在正在做的事情:

for (i=1; i<=rows; i++) {
  for (j=1; j<=cols; j++)  {
    cell = content.getCell(i, j).getValue();
    if (content.getCell(i, j).getFormula()) {continue;}
    try {
      cell = cell.replace (find, replace);
      content.getCell(i, j).setValue(cell);
    }
    catch (err) {continue;}
  }
}

内置方法可立即替换文本,因此我认为有更好的方法可以解决这个问题。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

不是逐个从工作表中检索每个单元格,而是使用getDataRange()和getValues()在一次调用中获取数组中的所有数据,然后在数组上执行搜索。

然后,根据您是否可以在运行脚本的同时编辑实时用户,您可以替换数组中的值并使用setValues()重写整个工作表,也可以使用setValue()用于逐个更新具有匹配项的特定单元格。

请参阅: https://developers.google.com/apps-script/reference/spreadsheet/sheet#getdatarange

https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues

答案 1 :(得分:0)

试试这个......

for (i=1; i<=rows; i++) {
  for (j=1; j<=cols; j++)  {
    cellLoc = content.getCell(i, j);
    cellValue = cellLoc.getValue();
    if (cellLoc.getFormula()) {continue;}
    try {
      cellValue = cellValue.replace (find, replace);
      cellLoc.setValue(cell);
    }
    catch (err) {continue;}
  }
}

我取消了content.getCell(i,j)的每个实例,而是将其存储到cellLoc中。这样每次你需要content.getCell(i,j)时,程序就不必在内容中找到单元格,它只能看看cellLoc的值是什么。让我知道它是否有效以及时间是否有所改善......

答案 2 :(得分:0)

嗯,我没有看到这种方法与我的第一种方法有很大区别,但它现在立即取代所有比赛:

function findReplace() {

  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getDataRange();
  var values = range.getValues();

  var i, j, find, replace;
  find = "hello";
  replace = "bravo!!";  

  for (i = 0; i < values.length; i++) { //Run through all rows
    for (j = 0; j < values[i].length; j++) { //Run through all columns
      if (values[i][j] == find){
        values[i][j] = replace;
      }
    }
  }
  range.setValues(values);
}