Есть ли способ исключить ячейки, содержащие формулы, из моего скрипта Google? - PullRequest
0 голосов
/ 24 февраля 2020

Извинения за то, что об этом уже спрашивали, но если бы кто-то мог указать мне правильное направление, это было бы здорово. Я искал несколько версий / решений для этого, но не могу найти одну (возможно, я искал не в том месте).

По сути, я ищу способ исключить любые ячейки, которые содержит формулу из следующего скрипта. Так что я хочу, чтобы он запускался только для ячеек с точным соответствием "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;
  }
}

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Поток:

  • getFormulas и заменять только в том случае, если массив формул пуст

Пример сценария:

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)
      )
    )
  );
}
1 голос
/ 24 февраля 2020

Вы можете использовать метод 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")
      }
    }
  }
...