仅在Google电子表格的最后一行查找和替换

时间:2016-04-03 23:11:44

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

我正在尝试让此功能在电子表格上运行,并找不到所有撇号并替换所有撇号。现在它可以工作,但它需要很长时间,现在我的电子表格中有12行,只需要128秒即可运行。我想尝试做的只是在电子表格的最后一行激活。

我尝试通过添加var row = r.getLastRow();并更改几个点以使用行来使其工作。当我这样做时,我无法让它运行。我将在每次提交表单时运行它,因此它应该始终是最后一行。

我从以下代码获得了代码:https://productforums.google.com/d/msg/docs/7IlOotksJ4I/liXa0SrC-R4J

function fandr() {
  var r=SpreadsheetApp.getActiveSheet().getDataRange();
  var rws=r.getNumRows();
  var cls=r.getNumColumns();
  var i,j,a,find,repl;
  find="'";
  repl="";
  for (i=1;i<=rws;i++) {
    for (j=1;j<=cls;j++) {
      a=r.getCell(i, j).getValue();
      if (r.getCell(i,j).getFormula()) {continue;}
      try {
        a=a.replace(find,repl);
        r.getCell(i, j).setValue(a);
      }
      catch (err) {continue;}
    }
  }
}

2 个答案:

答案 0 :(得分:1)

我遇到了同样的性能问题,并发现Google在处理多个单元格时鼓励getValues超过getValue。你得到一个带有getValues的二维数组。见https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues

答案 1 :(得分:1)

在我看来,用脚本替换文本的最佳方法是使用map。 @ serge-insas here建议使用此功能。您可以对其进行修改以获得最佳性能结果,并仅替换最后一行值:

function testReplaceInRange(){
    var sheet = SpreadsheetApp.getActiveSheet()
    var lastRow = sheet.getLastRow();
    var DataRange = sheet.getDataRange();

    var range = DataRange.offset(lastRow - 1, 0, 1); // last Data row

    replaceInRange(range,"'","");
}


function replaceInRange(range, to_replace, replace_with) {
  //get the current data range values as an array
  var values = range.getValues();

  // make RegExp
  var Rep = new RegExp(to_replace, 'g');
  //loop over the rows in the array
  for(var row in values){

    //use Array.map to execute a replace call on each of the cells in the row.
    var replaced_values = values[row].map(function(original_value){
      return original_value.toString().replace(Rep,replace_with);
    });

    //replace the original row values with the replaced values
    values[row] = replaced_values;
  }

  //write the updated values to the range
  range.setValues(values);
}

我还使用了正则表达式的trich,由@ cory-gross here建议。它的目的是替换所有to_replace文本,而不仅仅是第一个。httpd.conf文本。