0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Googleスプレッドシート】MAPで「計算の上限に達しました」エラーが出る時、ARRAYFORMULAなら処理できるかも【GAS無し】

Posted at

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(...)
処理方式 各セルに対して LAMBDA1回ずつ実行 配列全体に対して IF(...)一括で実行
計算コスト 高い(列数×行数分の LAMBDA 呼び出し) 比較的低い(IF のベクトル演算)
並列処理 弱い:LAMBDA 呼び出しは逐次実行的 強い:Google Sheets の最適化対象
限界到達しやすさ 高い(特に範囲が広いと即アウト) 低い(かなり広い範囲まで許容される)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?