it-swarm.com.de

Überlappen Sie den Bereich und hängen Sie an jeden einen String an

Ich habe einen Bereich von Zellen in einer Google-Tabelle (aktiverange) ausgewählt.

Ich möchte über jede Zelle in diesem Bereich iterieren und am Ende eine Zeichenfolge hinzufügen. Der String ist immer derselbe und kann in die Funktion hartcodiert werden.

Es scheint eine sehr einfache Sache zu sein, aber ich habe mich seit einer Stunde mit dem Code herumgespielt und kann nichts Nützliches zustande bringen, und die Dokumente helfen wirklich nicht. 

Hier ist was ich jetzt habe. Ich programmiere nicht JS (ich kenne VBA, für all das hilft ..).

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);
  }
}

Jede Hilfe wäre sehr dankbar.

36
ezuk

Sie können so etwas versuchen:

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);
    }
  }
}
75
flyingjamus

Oder verwenden Sie alternativ setValues ​​() , wodurch alle Werte gleichzeitig geschrieben werden. Scheint auch schneller auszuführen.

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)
19
Voy

hier ist ein Update für Voys post , verwendet range.getValues ​​() , um alle Werte abzurufen und ein temporäres Array wegzulassen. sollte noch schneller sein, da range.getCell().getValue() in der zweidimensionalen Schleife ausgelassen wird. Beachten Sie, dass die Indizes in diesem Snippet mit 0 beginnen. Ich finde das auch lesbarer.

  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);
3
Elan Ruusamäe

Hier ist eine sehr allgemeine Funktion, die die Werte eines Bereichs durchläuft. Es kann auch verwendet werden, um eine reduce-Funktion darauf auszuführen (was in Ihrem Fall nützlich ist). Es kann auch aus der Schleife ausbrechen, wenn Sie nur das erste Element eines Elements suchen möchten.

Es kann sehr einfach geändert werden, um eine tatsächliche Range-Instanz anstelle des Array von Werten zu akzeptieren.

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();

In Ihrem Fall:

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
Alexander Bird

Ich ziehe die Javascript 1.6-Methode forEach den alten for-Schleifen vor. Sie können:

function appendString() {
    var range = SpreadsheetApp.getActiveSheet().getActiveRange();
    var values = range.getValues();

    values.forEach(function(row, rowId) {
        row.forEach(function(col, colId) {
            values[rowId][colId] += " string";
            // Or: range.getCell(rowId + 1, colId + 1).setValue(col + " string");
            // Note: - '+1' to hit the cells, when using getCell
            //       - 'col' holds the current value of range.getCell(rowId + 1, colId + 1)
        });
    });

    range.setValues(values); // needless if using range.getCell(...).setValue(...);
}

Javascript 1.6 bietet auch map an, was mir sogar noch lieber ist:

function appendString() {
  var range = SpreadsheetApp.getActiveSheet().getActiveRange();
  var values = range.getValues();

  var modified = values.map(function (row) {
    return row.map(function (val) { 
      return val + " string"; 
    }); 
  })

  range.setValues(modified);
}

Ich möchte in beiden Fällen Pfeilfunktionen verwenden, sie werden jedoch noch nicht von Google-Apps-Script unterstützt.

1
Stephan Stamm

Google-Sheets
Sie können dies leicht mit Suchen und Ersetzen tun.

  • Wählen Sie Ihren Bereich aus

  • Finden:

    ^(.*)$
    
  • Ersetzen: 

    $1AppendString
    
  • Markiere Verwenden Sie Reguläre Ausdrücke 

  • Klicken Sie auf Alle ersetzen

Ich sehe keinen Vorteil der Verwendung von Skripts hier, aber wenn Sie müssen, können Sie auch eine Find Replace -Anforderung über die Tabellen-API ausgeben.

0
TheMaster