Iterować ponad zakres, dołączać łańcuch do każdego

Mam zakres komórek wybranych w arkuszu kalkulacyjnym Google (activerange).

Chcę iterować nad każdą komórką w tym zakresie i dodać ciąg znaków na końcu. Ciąg znaków jest zawsze taki sam i może być zakodowany na twardo w funkcji.

Wydaje się to bardzo proste, ale od godziny grzebałem w kodzie i nie mogę uzyskać niczego użytecznego, a dokumenty naprawdę nie pomagają.

Oto, co mam teraz. Nie koduję JS (znam VBA, dla wszystkich to pomaga..).
function appendString() {
  var range = SpreadsheetApp.getActiveSheet().getActiveRange();
  for (var i = 0; i < range.length; i++) {
    var currentValue = range[i].getValue();
    var withString = currentValue + " string";
    range[i].setValue(withString);
  }
}
Każda pomoc będzie mile widziana.
Author: Rubén, 2012-11-28

4 answers

Możesz spróbować czegoś takiego:

function appendString() {
  var range = SpreadsheetApp.getActiveSheet().getActiveRange();
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var i = 1; i <= numRows; i++) {
    for (var j = 1; j <= numCols; j++) {
      var currentValue = range.getCell(i,j).getValue();
      var withString = currentValue + " string";
      range.getCell(i,j).setValue(withString);
    }
  }
}
 71
Author: flyingjamus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 12:53:32

Lub alternatywnie użyć setValues () , która zapisuje wszystkie wartości w tym samym czasie. Wydaje się, że wykonuje też szybciej.

var range = SpreadsheetApp.getActiveSheet().getActiveRange();
var numRows = range.getNumRows();
var numCols = range.getNumColumns();
var writeValues = []
for (var i = 1; i <= numRows; i++) {
  var row = []
  for (var j = 1; j <= numCols; j++) {
    var currentValue = range.getCell(i,j).getValue();
    var withString = currentValue + " string";
    row.push(withString)
  }
  writeValues.push(row)
}
range.setValues(writeValues)
 17
Author: Voy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-19 14:07:18

Tutaj jest bardzo ogólna funkcja, która iteracje nad wartościami zakresu. Może być również użyty do wykonania na nim funkcji reduce (co jest przydatne w Twoim przypadku). Może również wyrwać się z pętli, jeśli kiedykolwiek chcesz znaleźć tylko pierwszy element.

Można ją bardzo łatwo zmienić, aby przyjąć rzeczywistą instancję Range zamiast tablicy wartości.

function range_reduce(rangeValues,fn,collection) {
  collection = collection || [];
  var debug_rr = "<<";
  for(var rowIndex = 0, row=undefined; rowIndex<rangeValues.length && (row = rangeValues[rowIndex]); rowIndex++) { 
    for(var colIndex = 0, value=undefined; colIndex<row.length && (value = row[colIndex]); colIndex++) {
      try {
        collection = fn(collection, value, rowIndex, colIndex);
      } catch (e) {
        if(! e instanceof BreakException) {
          throw e;
        } else {
          return collection;
        }
      }
    }
  }
  return collection;
}

// this is a created, arbitrary function to serve as a way
// to break out of the reduce function. Your callback would
// `throw new BreakException()` and `rang_reduce` would stop
// there and not continue iterating over "rangeValues".
function BreakException();

W Twoim przypadku:

var range = SpreadsheetApp.getActiveSheet().getActiveRange()
var writeValues = range_reduce(range.getValues(), function(collection, value, row, col) {
    collection[row] || collection.push([]);
    collection[row].push(value + " string");
});
range.setValues(writeValues)
 2
Author: Alexander Bird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 12:49:12

Oto update do Voy ' s post , używa range.getValues () Aby pobrać wszystkie wartości i pominąć tymczasową tablicę. powinno być jeszcze szybsze, ponieważ {[1] } jest pominięte w pętli dwuwymiarowej. Zauważ, że indeksy zaczynają się od 0 w tym fragmencie. Ja też uważam to za bardziej czytelne.

  var cells = range.getValues();
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var i = 0; i < numRows; i++) {
    for (var j = 0; j < numCols; j++) {
      cells[i][j] += " string";
    }
  }

  range.setValues(cells);
 1
Author: Elan Ruusamäe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 19:59:11