GASでスプレッドシート内のデータを取得して貼り付ける時、setValue()とsetValues()があるのはご存知かと思います。今回はこの2つの実行速度を比較していきたいと思います。
測定方法はシンプルで、1,000行のデータをいかに速くペーストできるかを競います。
#①setValue()を使って貼り付け
詳細な解説は省きますが、簡単に言うと下記手順を実施しています。
- getValue()で1セル分のデータを取得
- setValue()で、1.で取得したデータを貼り付ける
- 1.~2.を1,000回繰り返す。
//---------- ペースト関数 ----------
function pasteValues() {
// 現在のシートを取得
const Sheet = SpreadsheetApp.getActiveSheet();
// シートの最終行を定義
const LastRow = Sheet.getLastRow() + 1;
// ☆☆☆☆☆☆☆☆☆ 1つずつ貼り付け ☆☆☆☆☆☆☆☆☆
let value = "";
for (let i = 2; i < LastRow; i++) {
value = Sheet.getRange(`A${i}`).getValue();
Sheet.getRange(`B${i}`).setValue(value);
}
// ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
}
#②setValues()を使って貼り付け
setValues()を使う際、引数は2次元配列にしてください。
※getValues()でデータを取得した時点で2次元配列になっていますが、getValue()で取得した場合は1次元配列になってしまいますのでご注意を。
setvalues()とgetValues()の使い方はググればわかりやすい記事がたくさん出てきますので、そちらをご参考に。
//---------- ペースト関数 ----------
function pasteValues2() {
// 現在のシートを取得
const Sheet = SpreadsheetApp.getActiveSheet();
// シートの最終行を定義
const LastRow = Sheet.getLastRow() + 1;
// // ################### 一気に貼り付け ###################
const ValueArr = Sheet.getRange(`A2:A${LastRow}`).getValues();
Sheet.getRange(2, 2, ValueArr.length, ValueArr[0].length).setValues(ValueArr);
}
#実行速度比較
①と②の実行速度ですが、結論から申し上げますと②の方が断然早いです。
試しにそれぞれの検索方法で5回処理を行い平均値を出してみたところ、次のような結果になりました。
①:168,211.4[ms] → 約168秒
②:320[ms] → 約0.3秒
1000行のコピペでは500倍以上の差が出ました。
参考までに、②の方法で200,000行のデータを貼り付けしたところ、約18秒でした。
setValues()は優秀。
#まとめ
setValues()のエラーが出まくっていた時期もありましたが、慣れれば使いやすいです。
それに数万行のデータをインポートして自動化処理を行う、という場合に①の方法だと時間制限にかかってしまいますね。