替换Google表格中的文字并维护公式

时间:2015-03-25 01:16:35

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

我有一张Google Sheet,我想将其用作模板。用户提交表单,OnFormSubmit触发器生成模板的副本,并用答案替换某些文本。我想在几个应用程序中使用它,并且这些文本字段的位置可能会发生变化,因此我不想为每次替换指定特定范围或命名范围。

使用this question中的一些整洁代码,我可以完全按照自己的意愿行事。除此之外,使用此方法删除模板中的公式。换句话说,模板中的单元格具有=E10*F10,但在替换后,该值为空或0。

是否可以在我拥有的代码中修复此问题?除了尝试不同的方法,我无法找到解决方案......

function replacetext(target,key,value){
var spread_sheet = SpreadsheetApp.open(target)
var sheet = spread_sheet.getSheetByName('Sewage Flows');
replaceInSheet(sheet,key,value);
}


function replaceInSheet(sheet, to_replace, replace_with) {
  //get the current data range values as an array
  var values = sheet.getDataRange().getValues();
  Logger.log("values: " + values)

  //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(to_replace,replace_with);
    });

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

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

1 个答案:

答案 0 :(得分:0)

这不是最好的解决方案,它看起来效率很低但是有效。我将方法从使用getValues()抓取所有值改为getDataRange()

然后我只检查一个公式并跳过这些单元格。也许有更好的方法。

function replacetext(target,key,value){
    var spread_sheet = SpreadsheetApp.open(target)
    var sheet = spread_sheet.getSheetByName('Sewage Flows');
    replaceInSheet(sheet,key,value);
}


function replaceInSheet(sheet, to_replace, replace_with) {
  //get the current data range values as an array
  var range = sheet.getDataRange();
  var LastRow = range.getLastRow();
  var LastCol = range.getLastColumn();


  for(var i=0; i<= LastRow; i++){

    for(var k=0; k<= LastCol; k++){
      var formula = sheet.getRange(i+1,k+1).getFormula();

      if(formula == ""){
        var old_value = sheet.getRange(i+1,k+1).getValue().toString()
        var new_value = old_value.replace(to_replace,replace_with);
        Logger.log("old, new: " + old_value + ", " + new_value);
        sheet.getRange(i+1,k+1).setValue(new_value);
      }
    }  
  }  
}