GASのスプレッドシートがどのくらいまで実用的かを知るため、スピードテストをしてみたら、結果が面白かったのでメモ。
値自体は、環境やタイミングによって全然変わってくると思うので参考程度です。
準備
シート
下のシートを用意しました。1万行、108列(CZ列まで)、約100万セル。
自分の環境では、このくらいのデータサイズになると、落ちたり、フリーズしたりと、ブラウザでの処理にはややストレスを感じます。
Googleスプレッドシートの上限は1000万セルだそうです(2024年3月現在)。
コード
下のコードを実行しました。
test.gs
function myFunction() {
console.time('Hello');
console.log('Hello World');
console.timeEnd('Hello');
console.time('GetSheet');
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sh = ss.getActiveSheet();
console.timeEnd('GetSheet');
console.time('GetSheet2');
const sh2 = SpreadsheetApp.getActiveSheet();
console.timeEnd('GetSheet2');
let str;
console.time('GetSheetName');
str = sh.getName();
console.timeEnd('GetSheetName');
console.time('GetCellValue');
str = sh.getRange('A1').getValue();
console.timeEnd('GetCellValue');
let values;
console.time('GetCellValues_10k');
values = sh.getRange('A1:CZ100').getValues();
console.timeEnd('GetCellValues_10k');
console.time('GetCellValues_100k');
values = sh.getRange('A1:CZ1000').getValues();
console.timeEnd('GetCellValues_100k');
console.time('GetCellValues_1m');
values = sh.getRange('A1:CZ10000').getValues();
console.timeEnd('GetCellValues_1m');
}
手順
3回テストしました。1回目・2回目はそのまま。3回目は[A1]セルの値だけ100に変更。
結果
Label | 1回目 | 2回目(無編集) | 3回目(編集後) |
---|---|---|---|
Hello | 3ms | 3ms | 4ms |
GetSheet | 11ms | 10ms | 8ms |
GetSheet2 | 2ms | 2ms | 2ms |
GetSheetName | 287ms | 314ms | 307ms |
GetCellValue | 168ms | 106ms | 189ms |
GetCellValues_10k | 165ms | 122ms | 179ms |
GetCellValues_100k | 930ms | 165ms | 840ms |
GetCellValues_1m | 8522ms | 571ms | 9013ms |
考察
セルの値の取得について
- セルの値の取得には時間がかかる
- 1セル取得するのも、1万セル取得するのも、たいして変わらない
- 1万→10万になるとセル数に応じて時間がかかるようになる
- 10万→100万はほぼセル数に比例する形で時間がかかる
- 全く編集せずに同じセルの値を取得すると明らかに速い
- 少しでも編集をするともとに戻る
それ以外
- スプレッドシートを取得してからシートを取得するのと、シートを直接取得するのとで所要時間が異なる(GetSheetとGetSheet2の差)。ここは計測可能なレベルの差があるとは思っていなかった
- シート名の取得は遅い。VBA同様、プロパティを扱う処理は遅いと思われるが、セルの値の取得に比べて極端に遅いのかどうかは追加検証が必要