Sheet
オブジェクトのRange
とsetValue
の扱いかたで劇的に速度が変わります。Google Apps Script はサーバーサイドで動作するので、なるべくサーバー側で動作するようなコードを心がけると良いです。
Class Range
以下のコードは、3つのやり方で1,000行のセルに乱数をセットし、それぞれの経過時間を計る簡単なベンチマークプログラムです。
doRandom1 - 質問者様の提示されたやり方。A1形式でセルを指定してB列に値をセット
doRandom2 - 行ごとに、C列にgetRange(row, column)で取得したRangeに乱数をセット
doRandom3 - 乱数をあらかじめ配列に格納しておき、getRange(row, column rowNum) で取得したRange に配列でD列に一挙にセット。Range.setValues
の使用例。
JavaScript
1 function doTest ( ) {
2 try {
3 var ss = SpreadsheetApp . getActiveSpreadsheet ( ) ;
4 var sheet = ss . getSheetByName ( "シート2" ) ;
5 var num = 1000 ;
6 var elapse
7
8 sheet . clear ( ) ;
9 elapse = doRandom1 ( sheet , num ) ;
10 Browser . msgBox ( "#1: " + String ( elapse ) ) ;
11
12 elapse = doRandom2 ( sheet , num ) ;
13 Browser . msgBox ( "#2: " + String ( elapse ) ) ;
14
15 elapse = doRandom3 ( sheet , num ) ;
16 Browser . msgBox ( "#3: " + String ( elapse ) ) ;
17
18 } catch ( e ) {
19 Logger . log ( "Exception: " + e ) ;
20 }
21 Browser . msgBox ( Logger . getLog ( ) ) ;
22 }
23
24 // A1 notation
25 // B列にデータをセット
26 function doRandom1 ( sheet , num ) {
27 var sdt = new Date ( ) ;
28
29 for ( var i = 1 ; i <= num ; i ++ ) {
30 var rand = Math . random ( ) ;
31 sheet . getRange ( 'B1' ) . offset ( i - 1 , 0 ) . setValue ( rand ) ;
32 }
33 var edt = new Date ( ) ;
34 var elapse = edt . getTime ( ) - sdt . getTime ( ) ;
35
36 return elapse ;
37 }
38
39 // C列にデータをセット
40 function doRandom2 ( sheet , num ) {
41 var sdt = new Date ( ) ;
42
43 for ( var i = 1 ; i <= num ; i ++ ) {
44 var rand = Math . random ( ) ;
45 // row, column
46 sheet . getRange ( i , 3 ) . setValue ( rand ) ;
47 }
48 var edt = new Date ( ) ;
49 var elapse = edt . getTime ( ) - sdt . getTime ( ) ;
50
51 return elapse ;
52 }
53
54 // D列にデータをセット
55 function doRandom3 ( sheet , num ) {
56 var sdt = new Date ( ) ;
57
58 var array = [ ] ;
59 for ( var i = 0 ; i < num ; i ++ ) {
60 var rand = Math . random ( ) ;
61 var item = [ rand ] ;
62 array . push ( item ) ;
63 }
64
65 // row, column, num
66 var range = sheet . getRange ( 1 , 4 , num ) ;
67 // 配列で一挙にセット
68 range . setValues ( array ) ;
69
70 var edt = new Date ( ) ;
71 var elapse = edt . getTime ( ) - sdt . getTime ( ) ;
72
73 return elapse ;
74 }
下の表は実行結果です。下のものほど速いです。本来なら何回もテストして平均を取るべきですが、何回試しても傾向は変わらないので、その内の1回だけを示します。
No メソッド 経過時間(ミリ秒) 備考 1 doRandom1 199,368m秒 1行毎にセルにセットする様子が確認できる 2 doRandom2 1,295m秒 スクリプトの終了後にシートに表示される 3 doRandom3 22m秒 スクリプトの終了後にシートに表示される
スクリプトの終了後にシートに反映されるのは、サーバー側で処理された後、一挙にクライアント(ブラウザー)側に返されるからだと思います。
参考に、シートの様子を張っておきます。