有没有办法从我的 Google 脚本中排除包含公式的单元格?

Is there a way to exclude cells that contain formulas from my Google Script?

抱歉,这个问题已经被问过了,但如果有人能指出我正确的方向,那就太好了。我为此找了几个 versions/solutions,但似乎找不到(我可能找错地方了)。

基本上,我正在寻找一种方法来从以下脚本中排除任何包含公式的单元格。所以我只希望它在完全匹配“1”的单元格上 运行 这个。任何帮助将不胜感激。

function runReplaceInSheet(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("2020");
  //  get the current data range values as an array
  var values = sheet.getDataRange().getValues();  

  // Replace 1 with HOL
  replaceInSheet(values, "1", "HOL");

  // Write all updated values to the sheet, at once
  sheet.getDataRange().setValues(values);
}

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

您可以使用 getFormulas() 方法获取当前工作表中的所有公式,并像二维数组一样遍历它们。

  var values = sheet.getDataRange().getDisplayValues();  
  var formulas = sheet.getDataRange().getFormulas();  
  for (var r=0; r<values.length; r++) {
    for (var c=0; c<values[r].length; c++) {
      var cellValue = values[r][c];
      var formula = formulas[r][c];
      if (!formula && cellValue === "1") {
        sheet.getRange(r+1, c+1).setValue("HOL")
      }
    }
  }

流量:

  • 获取公式并仅在公式数组为空时替换

示例脚本:

function replace(sheetName = '2020', searchValue = '1', replaceValue = 'HOL') {
  const sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  const range = sheet.getDataRange();
  const formulas = range.getFormulas();
  const values = range.getValues();
  range.setValues(
    formulas.map((row, i) =>
      row.map(
        (formula, j) =>
          formula || values[i][j].toString().replace(searchValue, replaceValue)
      )
    )
  );
}