【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倍もスピードアップしたわけです。
セルへのアクセス数を減らすことが速度アップのコツです。
スポンサーリンク

