スプレッドシートを軽くする方法いくつか
1.INDIRECTを消す
こいつが一番重いです。
2.シート数を減らす
GASでのスプシ読込もIMPORTRANGEも、とにかくシート数が多いと時間がかかります。
シート数をできるだけ減らす(もちろん非表示シートも)。
3.履歴を消す
履歴を遡れるのはスプレッドシートの超利点ですが、同時にこれが超重いです。
履歴を消す=スプシを新規作成して必要情報だけ移す
これが一番軽いと思います。
4.「空白」を除去する
=iferror(vlookup(A1, B:D, 3, false), "")
=if(A1="", "", vlookup(A1, B:D, 3, false))
このように、エラー時に空白を入れるなどの処理があったらすべて削除すると軽くなる。
最悪、ARRAYFORMULAで1万行とか無駄に空白が入っていることもある。
IMPORTRANGEはこの「""」をちゃんとデータとして認識するので、IMPORTRANGE先も軽くなる。
改善例:
=iferror(vlookup(A1, B:D, 3, false), )
=if(A1="", , vlookup(A1, B:D, 3, false))
5.範囲の繰り返し参照を減らす
=arrayformula(vlookup(A:A, importrange("xxxxx", "AAA!A:B"), 2, false)
この例ではIMPORTRANGEを1列分呼び出している。最悪である。
LET関数でIMPORTRANGEを頭に出して、一度だけ参照するようにすると少し軽くなる。
改善例:
=let(range,importrange("xxxxx", "AAA!A:B"), arrayformula(vlookup(A:A, range, 2, false))
GASと同じで、getValue()の部分が重いのだと思う。
なのでgetValue()は一度のみにして、中身を配列に詰めて使い回す。
6.揮発性関数を避ける
Excelとは違うかもしれないが、OFFSETやINDIRECTのような揮発性関数は使わない方が確実に軽い。
あとROWなども重いらしい。
7.可能ならVLOOKUPを使う
こちらもしっかりと検証していないが、XLOOLUPよりはVLOOKUPの方が速いらしい。
正規表現を使わないならVLOOKUPにする。
下から検索する場合は、SOTR関数と組み合わせる。
結果列が検索列の左側にある場合は、範囲を配列にするとVLOOKUPでも参照できる。
=xlookup(A1, D:D, B:B, , 0)
=vlookup(A1, {D:D, B:B}, 2, false)
8.IMPORTRANGE
INDIRECTやOFFSETが重い理由と同じだが、IMPORTRANGEも範囲を直接指定せず文字列で探すので重い。
恐らく内部で、渡された文字列を元にまず参照先のスプレッドシートの全シートを取得、その中から該当シートの該当範囲の情報を返しているので、シート数が多いスプレッドシートを参照するほど重くなると思われる。
GASでgetSheetByIdする際も同じ。シート数の多いスプレッドシートを参照するほど重くなる。
また、IMPORTRANGEで参照した先のデータに「""」空白があると、これを空データではなく実データとして全て引っ張ってくるので、例えば
=IFERROR(何か処理, "")
のように、何もなければ「""」を代入する処理があれば、1.のように全て空文字にする。
=IFERROR(何か処理, )