web-dev-qa-db-ja.com

範囲を反復し、それぞれに文字列を追加します

Googleスプレッドシートでセルの範囲を選択しています(アクティブ範囲)。その範囲内のすべてのセルを反復処理し、最後に文字列を追加します。文字列は常に同じであり、関数にハードコーディングできます。

それは本当に単純なことのように思えますが、私は今から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);
  }
}
41
ezuk

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

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

または、代わりに 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)
20
Voy

Voy's post の更新です。 range.getValues() を使用してすべての値を取得し、一時配列を省略します。 range.getCell().getValue()は2次元ループで省略されるため、さらに高速になります。このスニペットでは、インデックスは0から始まることに注意してください。これも読みやすいと思います。

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

私は、古い学校のforEachループよりもJavascript 1.6 forメソッドの方が好きです。あなたはできる:

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

    range.setValues(values);
}

RowIdとcolIdはゼロベースであることに注意してください。そして、オールドスクールのソリューションのような1ベースではありません。 Javascript 1.6はmapも提供します。これは検討する価値があります。

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

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

  range.setValues(modified);
}

矢印関数を使用すると、コードは改善されますが、google-apps-scriptではまだサポートされていません。

2
Stephan Stamm

以下は、範囲の値を反復処理する非常に汎用的な関数です。 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)
2
Alexander Bird

google-sheets
これは、検索と置換で簡単に行えます。

  • 範囲を選択してください

  • 見つける:

    ^(.*)$
    
  • 交換:

    $1AppendString
    
  • 正規表現を使用するをマークする

  • すべて置換をクリック

ここでスクリプトを使用する利点は見当たりませんが、必要な場合は、sheets APIを使用して Find Replace リクエストを発行することもできます。

0
TheMaster