
プログラミングを勉強します86日目:200703
前回までの振り返り
■前回の外部設計
https://note.com/daichan_dream/n/n09f74decd548
■前回の内部設計
https://note.com/daichan_dream/n/n09f74decd548
■アウトプットイメージ
https://note.com/daichan_dream/n/n2ab044382c9b
前回は下記サイトで学び直し32日目でした。
■前回は『表示の固定』を学びました。
https://excel-ubara.com/apps_script1/GAS033.html
今日は下記で『スプレッドシートが非常に遅い、高速化するには』を
進めていきます。
https://excel-ubara.com/apps_script1/GAS035.html
データ量が多くなると処理時間がかかるようになってしまう。
そのために配列をつかうことで処理速度を早くしていくことができる。
時間のかかる処理はセルへのデータ読み書きでス。
配列は使用してセルへのデータの読み書きを回数をへらすことができます。
単純な掛け算を200行繰り返すことを例にあげて早くするのが課題です。
function mySample35_1() {
var sheet = SpreadsheetApp.getActiveSheet();
var tannka,suuryou
var lastRow = sheet.getLastRow();
for (i=2; i<=lastRow; i++) {
tannka = sheet.getRange(i, 2).getValue();
suuryou = sheet.getRange(i, 3).getValue();
sheet.getRange(i, 4).setValue(tannka * suuryou) ;
}
}
上記の書き方が今までのもので15秒程度かかります。
これを配列を使用してかくと下記のようになります。
function mySample35_2() {
var sheet = SpreadsheetApp.getActiveSheet();
var tannka,suuryou
var lastRow = sheet.getLastRow();
var ary1 = sheet.getRange(2, 2, lastRow-1, 3).getValues();
for (i=0; i<=ary1.length-1; i++) {
ary1[i][2] = ary1[i][0] * ary1[i][1]
}
sheet.getRange(2, 2, lastRow-1, 3).setValues(ary1);
}
配列を使用すると1秒程度で計算が終えています。
内容をみていきます。
var ary1 = sheet.getRange(2, 2, lastRow-1, 3).getValues();
//aryは配列を意味しています。B2:C201までを取得しています。
getValuesにすることでセルの範囲を一括で配列化しています。
for (i=0; i<=ary1.length-1; i++) {
ary1[i][2] = ary1[i][0] * ary1[i][1]
}
//for文でのループ処理でのポイントは、ary1.lengthです。
ary1[i][2] = ary1[i][0] * ary1[i][1]
//aryには列はB、C、Dを配列としているので配列番号はそれぞれ
B=0、C=1、D=2となります。行も同様に2行目からになっているので
2は配列的には0になります。そのため上記のような計算になります。
sheet.getRange(2, 2, lastRow-1, 3).setValues(ary1)
//上記で最後は一気に計算した結果をsetValuesで計算結果を入れています。
以上です。約1ヶ月におよぶ学び直しを終えます。
次回からは本題に戻り挑戦していきたいと思います。