非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【GAS】スプレッドシートで複数のセルデータを高速処理するためのテクニック

   

Google Apps Script(GAS)を扱うにあたって一番速度を落とす処理はスプレッドシートのセルにアクセスするときです。これはExcelにも同じことが言えて、この処理を工夫するかしないかで処理速度が桁違いに変わります。

今回はその対処法とどれくらい速度UPするかについて書きたいと思います。

 

セルデータを別シートにコピーする例

以下の例はforループでセル1個1個を別シートにコピーしていく例です。何も考えないとこんなコードになるんじゃないでしょうか。

var dt1 = new Date();
var sheet1 = SpreadsheetApp.getActive().getSheetByName('Sheet1');
var sheet2 = SpreadsheetApp.getActive().getSheetByName('Sheet2');
for(var r=1; r<=50; r++){
  for(var c=1; c<=10; c++){
    var data = sheet1.getRange(r, c).getValue();
    sheet2.getRange(r, c).setValue(data);
  }
}
var dt2 = new Date();
console.log(dt2-dt1);
 

 

実行してみると約145秒(約2分半)もかかりました。これはなかなかしんどいですね。

 

配列+setValuesを使って速度UP

速度アップのテクニックとして、セル範囲で値をゲットすることで配列化します(data変数)。それをsetValuesメソッドで一括で処理すると速くなります。

var dt1 = new Date();
var sheet1 = SpreadsheetApp.getActive().getSheetByName('Sheet1');
var sheet2 = SpreadsheetApp.getActive().getSheetByName('Sheet2');
var data = sheet1.getRange("A1:J50").getValues();
sheet2.getRange("A1:J50").setValues(data);

var dt2 = new Date();
console.log(dt2-dt1);
 

 

ご覧の通り0.5秒になりました。280倍もスピードアップしたわけです。

 

セルへのアクセス数を減らすことが速度アップのコツです。

 

スポンサーリンク

 - Google Apps Script