前のページでは単独セルの操作についてみましたが、ここでは範囲(複数セル)を扱う方法について見ていきます。
複数セルを扱う手順
複数のセルを扱う場合、for文を使ってセルを一つずつ扱うことも可能です。その方が分かりやすいと感じることもあるでしょう。
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var range , val; for ( var i = 1 ; i <= 10 ; i++ ) { for ( var j = 1 ; j <= 5 ; j++ ) { range = sheet.getRange( i , j ) val = range.getValue(); if ( val == "" ) range.setValue( 0 ); } }
しかし、何度もgetValue()などのAPIを呼び出すとどんどん速度が落ちていきます。例えば上のスクリプトでは、getRange(),getValue(),setValue()が各50回出てきます。完走するのに約19秒かかりました。
一方getRange()で範囲全体を取得し、getValues()で全体の値を取得、配列の状態で処理を行ってから最後にsetValues()で書き出すとAPIの呼び出しがそれぞれ1回で済みます。下のスクリプトは1秒で書き出されました。
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var ranges = sheet.getRange( 1,1,10,5 ); var vals = ranges.getValues(); for ( var i = 0 ; i < 10 ; i++ ) { for ( var j = 0 ; j < 5 ; j++ ) { if ( val[i][j] == "" ) vals[i][j] = 0; } } ranges.setValues( vals );
このように複数のセルを扱うには、
という流れになります。
範囲の取得
範囲を取得するにはgetRange()を使います。
- sheet.getRange( 行番号 , 列番号 , 行数 , 列数 )
範囲を取得すると、2次元配列に格納されます。B2~D6まで範囲取得した場合、配列は以下のように表されます。
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var ranges = sheet.getRange( 2, 2, 5, 3 );
範囲の情報を取得する
getRange()を使って範囲を取得したあとは、その範囲の情報を取得していきます。
- ranges.getValues()
- 範囲の値を2次元配列に格納します
- ranges.getFontColors()
- 範囲の文字色を2次元配列に格納します
- ranges.getBackgrounds()
- 範囲の背景色を2次元配列に格納します
他にもgetFontFamilys()とかgetFontSizes(),getFontWeights(),などあります。
範囲に情報を一括指定する
2次元配列を操作した後は、一括書き出しを行います。
- ranges.setValues(2次元配列)
- 指定範囲に値を一括で指定します。
- ranges.setFontColors(2次元配列)
- 指定範囲に文字色を一括で適用させます。
- ranges.setBackgrounds(2次元配列)
- 指定範囲に背景色を一括で適用させます。
他にもsetFontFamilys()とかsetFontSizes(),setFontWeights(),などあります。