やりたいこと
以下のような表が有ったとします。
A | B | C | |
---|---|---|---|
1 | foo | bar | |
2 | baz | ||
3 |
これについて、A1
とB1
を結合した結果をC1
へ、A2
とB2
を結合した結果をC2
へ……という風に表示します。
期待値は以下の通りです(空文字列はエラーにしない想定)。
A | B | C | |
---|---|---|---|
1 | foo | bar | foobar |
2 | baz | baz | |
3 |
ただし、入力はC1
セルにだけ行います。
例では1行ずつ処理した結果をある列に表示していますが、同じやり方で1列ずつ処理した結果をある行に表示することもできます。
やり方
BYROW
関数を用いることで、以下のようにできます。
=BYROW(A1:B, LAMBDA(row, CONCATENATE(row)))
解説
以下はChatGPT o3
に解説させたものを一部改変したものです。
要素 | 構文 (簡略) | 役割 / 返り値 | 補足・ポイント |
---|---|---|---|
BYROW | BYROW(array, lambda) | 指定した配列の各行を 1 行ずつ処理 し、処理結果を縦方向に返す。 | • 行単位のループを行列関数で実現 • 戻り値は「行数 × 1 列」になる |
A1:B | array | 入力となる範囲。 | • 行数は可変でも OK • ここでは行方向に読み込むため、各行は 2 セル (A・B) |
LAMBDA | LAMBDA(row, …) | BYROW が渡してくる 現在処理中の 1 行 を row という名前で受け取る。 | • 名前は自由だが可読性のため row が慣例 • 因数が 1 つの場合、最後に閉じ ) を追加するだけで OK |
row (パラメータ) | (LAMBDA 内) | 現在の行 (縦 1×横 2) 配列。 | • A・B 2 つのセルが配列として渡る • ここでは "文字列1", "文字列2" のような形 |
CONCATENATE | CONCATENATE(row) | 渡された配列を結合して 1 つの文字列 にする。 | • 区切り文字なしで直結 • 区切りを入れたい場合は TEXTJOIN+区切り文字を用いる |
返り値 | (BYROW の結果) | 各行ごとに A 列 + B 列 を連結した文字列が 下方向に 1 列で並ぶ。 | 例: 行1 → "AB" 行2 → "CD" … |
この記事は、公開後にBYROW
/BYCOL
関数を使った方が良いと教えて頂いたので書き直しました。
初公開時の、`MAP`を利用したやり方
やり方
MAP
関数を用いる場合、以下のようにできます。
=MAP(A1:A, LAMBDA(a, CONCATENATE(OFFSET(a, 0, 0, 1, 2))))
利点
セル1つに入力するだけで適用可能なため、よく列数 or 行数の変化する表に適用したい場合は便利です。
解説
以下はChatGPT o3
に解説させたものを一部改変したものです。
ここで、LAMBDA
の起点をa
としたのは、A
列の任意のセルが入るためです(= 目的によって適当な名前を付けてよい)。
パーツ | 役割 | ポイント |
---|---|---|
MAP(A1:A, …) |
A1 から下へ 1 行ずつ処理 し、結果を配列で返す | for ループのように繰り返す関数 |
LAMBDA(a, …) |
MAP が渡す「今見ているセル」を a という名前で受け取る |
受け取った値で自由に計算できる |
OFFSET(a, 0, 0, 1, 2) |
基点 a から「高さ 1 行 × 幅 2 列」の範囲(配列)を取得 |
つまり a とその右隣 |
CONCATENATE( … ) |
与えられた配列を文字列として結合 |