GAS備忘録複数セルを扱う

作成日:2020.06.18
  1. HOME
  2. 趣味のページ
  3. 複数セルを扱う
複数セルを扱う

前のページでは単独セルの操作についてみましたが、ここでは範囲(複数セル)を扱う方法について見ていきます。

  1. 複数セルを扱う手順
  2. 範囲の取得
  3. 範囲の情報を取得する
  4. 範囲に情報を一括指定する

複数セルを扱う手順

複数のセルを扱う場合、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 );
範囲取得した場合の2次元配列

範囲の情報を取得する

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(),などあります。