Скопировать активную ячейку в другие ячейки, содержащие строку - PullRequest
0 голосов
/ 31 августа 2018

В Google Sheets я пытаюсь создать скрипт, который будет брать значение из активной ячейки и вставлять это значение в любую ячейку в столбце B, содержащую строку «HR». Есть идеи?

1 Ответ

0 голосов
/ 31 августа 2018

Это не так уж плохо; вам просто нужно обдумать несколько идей из Apps Script и Javascript, чтобы сделать его эффективным. Но сначала давайте начнем с наивного подхода!

function firstTry() {
  var activeSheet = SpreadsheetApp.getActiveSheet();  // whatever is open
  var activeCell = SpreadsheetApp.getCurrentCell();   // this is a single-cell range
  var activeCellValue = activeCell.getValue();        // could be a string, number, etc
  // Now let's look in column B for stuff to change
  for (var i = 1; i <= activeSheet.getLastRow(); i++) {
    var cell = activeSheet.getRange("B" + i);
    var val = cell.getValue();
    var valStr = String(val);                        // We could have gotten a number
    if (valStr.indexOf("HR") != -1) {
      cell.setValue(activeCellValue);
    }
  }
}

Это, вероятно, будет работать, но не слишком эффективно: каждый вызов getValue () или setValue () занимает некоторое время. Было бы лучше просто получить все значения сразу, а затем вставить обратно измененный столбец B, когда мы будем удовлетворены:

function improvement() {
  var activeSheet = SpreadsheetApp.getActiveSheet();  // whatever is open
  var activeCell = SpreadsheetApp.getCurrentCell();   // this is a single-cell range
  var activeCellValue = activeCell.getValue();        // could be a string, number, etc
  // Now let's look in column B for stuff to change
  var rowsWithData = activeSheet.getLastRow() - 1;
  var colBRange = activeSheet.getRange(1,             // start on row 1
                                       2,             // start on column 2
                                       rowsWithData,  // this many rows
                                       1);            // just one column
  // Let's get the data as an array of arrays. JS arrays are 0-based, btw
  var colBData = colBRange.getValues();               
  for (var i = 0; i < colBData.length; i++) {
    var val = colBData[i][0];                         // row i, first column
    var valStr = String(val);                         // We might have gotten a number
    if (valStr.indexOf("HR") != -1) {
      colBData[i][0] = activeCellValue;               // modify copied data
    }
  }
  // Lastly, write column B back out
  colBRange.setValues(colBData);
}

Вы могли бы пойти дальше с причудливой функцией фильтра вместо того, чтобы зацикливаться на данных явно, но это начинает становиться менее ясным.

Предостережения , как указывает OP в комментариях ниже, слепой вызов setValues, как это, проложит все ваши формулы. Это не было бы ничего сложного, за исключением того, что это включает в себя гиперссылки. Вы могли бы по-настоящему принять участие, позвонив getFormulas параллельно с getValues и затем решить, следует ли вызывать setValue или setFormula в зависимости от исходного содержимого каждой ячейки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...