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