62

Google スプレッドシート (activerange) で選択されたセルの範囲があります。その範囲内のすべてのセルを反復処理し、最後に文字列を追加したいと思います。文字列は常に同じで、関数にハード コードできます。

それは本当に簡単なことのように思えますが、私はコードを1時間いじっていて、何の役にも立たず、ドキュメントは本当に役に立ちません.

これが私が今持っているものです。私は JS のコードを書いていません (VBA は知っています。それがすべて役立つからです..)。

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

8 に答える 8

113

次のようなことを試すことができます:

//
// helper `forEachRangeCell` function
//

function forEachRangeCell(range, f) {
  const numRows = range.getNumRows();
  const numCols = range.getNumColumns();

  for (let i = 1; i <= numCols; i++) {
    for (let j = 1; j <= numRows; j++) {
      const cell = range.getCell(j, i)

      f(cell)
    }
  }
}

//
// Usage
//

const range = SpreadsheetApp.getActiveSheet().getActiveRange();

forEachRangeCell(range, (cell) => {
  cell.setValue(`${cell.getValue()} string`)
})
于 2012-11-28T12:53:32.533 に答える
22

または、すべての値を同時に書き込むsetValues()を使用します。実行速度も速いようです。

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)
于 2015-04-19T14:07:18.530 に答える
3

これは、範囲の値を反復処理する非常に汎用的な関数です。また、その上で機能を実行するために使用することもできますreduce(これはあなたの場合に役立ちます)。要素の最初の要素だけを見つけたい場合は、ループから抜け出すこともできます。

値の配列の代わりに実際の Range インスタンスを受け入れるように、非常に簡単に変更できます。

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

あなたの場合:

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)
于 2015-11-04T02:56:27.293 に答える