複数列に渡す範囲の処理
ここまで行ってきたのは、基本的に「1列のみの処理」でした。しかし、表計算では複数列にまたがったデータを処理するのが一般的です。
複数列に渡る範囲指定はgetValueの戻り値が二次元配列で返されるため注意が必要です。二重の繰り返しを用意して処理する必要があります。
function myFunction() { var range= SpreadsheetApp.getActiveRange() var values = range.getValues(); var total = 0; for(var i = 0;i < values.length;i++){ for(var j = 0;j < values[0].length;j++){ total += values[i][j]; } } Browser.msgBox("合計:" + total); }
先ほどのスクリプトを修正したものです。ここでは、二重のforを使い、getValuesで取得した配列から値を取得しています。このやり方であれば、選択されたセル範囲が1列であろうと複数列であろうと、正しく値が計算できます。
セルをまとめて操作する
セルの値を取り出して処理するだけならgetValuesですみますが、セルを操作するとなるとまた話は変わってきます。単純に、Rangeのセルをまとめて操作するなら、作業は簡単です。そのままRangeの設定を変更すればいいだけですから。
function myFunction() { var range= SpreadsheetApp.getActiveRange() range.setValue("※選択されたセル"); }
これは、選択されたセルすべてに「※選択されたセル」と表示させるものです。ここではgetActiveRangeで取得したRangeをそのままsetValueで設定しています。このRangeで示されているセルがいくつあろうと、すべてひとまとめにして操作を行うことができます。これは非常に簡単ですね!
セルの値を変更する
問題は、1つ1つのセルを個別に設定する必要がある場合です。この場合は、各セルのRangeを取得し、それぞれを操作することになります。では、1つ1つのセルの値を設定するサンプルを考えてみましょう。
function myFunction() { var range= SpreadsheetApp.getActiveRange() var cols = range.getNumColumns(); var rows = range.getNumRows(); var total = 0; for(var i = 1;i <= rows;i++){ for(var j = 1;j <= cols;j++){ var cell = range.getCell(i, j); cell.setValue(i + "," + j); } } }
これは、選択されたセルすべてに、そのセルの行・列の相対番号を表示する例です。セルをいろいろと選択して動作を確かめてみるとよいでしょう。
ここでは、選択されているRangeの範囲を調べ、その範囲内のすべてのセルについてRangeを取得しsetValueする処理を行っています。まず選択されたRangeの範囲ですが、これは次のようなRangeのメソッドで調べることができます。
メソッド名 | 概要 |
getNumColumns | Rangeの列数を返す。 |
getNumRows | Rangeの行数を返す。 |
これで行・列それぞれの数が分かります。後は繰り返しを使い、Range内のそれぞれのセルのRangeを取得し、setValueで値を設定します。
var cell = range.getCell(i, j); cell.setValue(i + "," + j);
セルの取得は、Rangeに用意されている「getCell」で行います。これは引数に列・行の相対番号(Range内の何番目にあるかという番号)を指定して呼び出します。これで、そのセルのRangeが得られますので、後はsetValueを呼び出し値を設定するだけです。