#7GAS入門−大量のデータを一気に処理をする

GAS

目次

  • new Date() 現在時刻の取得をします。
  • 配列  名前を格納する配列です。
  • push  空の配列に名前を追加するメソッドです。
  • forループ  1000行分繰り返します。
  • getRange()  シートの範囲を取得します。
  • setValues()  セル範囲に値を代入。(複数系の命令)

今回は100行のデータから1000行のデータに増やしてみます。

GASではgetRange()setValue()などのシートを読み書きする処理には時間を要します。

では、1000行の処理にかかる時間を計ってみます。

new Date()

実行前の時刻を変数startTimeと宣言します。

var startTime = new Date();

処理にかかった時間現在時間 ー startTime(実行前の時刻)

経過時間をlogでみてみましょう。

Logger.log(new Date() - startTime);

2157.0秒(ミリ秒表示なので約2秒強)かかりました。

ここまでの処理を見ておきます。

時間短縮の方法を見ていきます。

時間がかかるシートの読み書きを一度で済むように

前もって配列scoresを準備し、forループ構文で配列に名前を格納しておきます。

配列

では、配列を宣言します。

var scores = [];

push

配列scoresに名前を追加するにはpushメソッドを使います。

scores.push([
    //配列に追加する内容を記述
    ]);

 名前を入れていくには

names[Math.floor(Math.random() * names.length)]

でしたね。

点数は

Math.floor(Math.random() * 101

 でした。

forループ

これらをforループ構文に入れてやります。

for (i = 1; i <= 1000; i++) {
    scores.push([
    names[Math.floor(Math.random() * names.length)],
    Math.floor(Math.random() * 101)
    ]);
  }

getRange()

次にgetRange()でセルの範囲を取得します。

一行1列目から1000行2列分ですね。

sheet.getRange(1, 1, 1000, 2)

setValues() 

その範囲にsetValues()で点数scoresの中身を入れます。

sheet.getRange(1, 1, 1000, 2).setValues(scores);

 最後に終了時刻からstartTimeを引きます。

Logger.log(new Date() - startTime);

 では実行結果を見てみます。「表示」→「ログ」ですね。

126ミリ秒ですから、0.126秒でした。

function initSheet() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var names = ['大久保','一橋','西郷','坂本','勝'];
  var i;
  var startTime = new Date();
  var scores = [];
  
  sheet.clear();
  
//  for (i = 1; i <=1000; i++) {
//    sheet.getRange(i, 1).setValue(names[Math.floor(Math.random() * names.length)]);
//    sheet.getRange(i, 2).setValue(Math.floor(Math.random() * 101));
//  }
  
  for (i = 1; i <= 1000; i++) {
    scores.push([
    names[Math.floor(Math.random() * names.length)],
    Math.floor(Math.random() * 101)
    ]);
  }
  
  sheet.getRange(1, 1, 1000, 2).setValues(scores);
  
  Logger.log(new Date() - startTime);
}

コメント