TL;DR
=MAP(
INDIRECT("before!A2:" & A2),
INDIRECT("after!A2:" & A2),
LAMBDA(bf, af, IF(bf = af, "", bf & CHAR(10) & "===" & CHAR(10) & af))
)
と書いた場合は「この数式の計算中に、計算の上限に達しました。」とエラーになる状況で、
=LET(
bf, INDIRECT("before!A2:" & A2),
af, INDIRECT("after!A2:" & A2),
ARRAYFORMULA(IF(bf=af, "", bf & CHAR(10) & "===" & CHAR(10) & af))
)
と書き換えることで、正常に処理できるようになった。
補足
LET
関数は、内部で一時変数を宣言して使いまわせる関数です。
今回の例では、before
/after
それぞれのシートに関する処理対象範囲について、それぞれbf
, af
という変数に格納し、ARRAYFORMULA
内で利用しています。
状況
before
/after
で巨大なシート(7万行弱 x 13列)同士を比較し、有れば差分を表示するシートを作成していました。
A2
セルにはデータの末尾列が入っています。
これは行数・列数を可変にしたかったためで、A2
セルも動的に算出し、更にそれを用いてINDIRECT
で動的な範囲算出を行っています。
原理
Chat GPT
に聞いてみたところ以下のような回答が出てきました。
要はARRAYFORMULA
の方が一括で高効率に処理できるようです。
点 | MAP(...) |
LET + ArrayFormula(...) |
---|---|---|
処理方式 | 各セルに対して LAMBDA を1回ずつ実行
|
配列全体に対して IF(...) を一括で実行
|
計算コスト | 高い(列数×行数分の LAMBDA 呼び出し) |
比較的低い(IF のベクトル演算) |
並列処理 | 弱い:LAMBDA 呼び出しは逐次実行的 |
強い:Google Sheets の最適化対象 |
限界到達しやすさ | 高い(特に範囲が広いと即アウト) | 低い(かなり広い範囲まで許容される) |