PONOS Advent Calendar 2025の 24 日目の記事です。
前回は tequila0725 さんの記事でした。
はじめに
Google Spreadsheet で少し複雑な処理が必要になったとき、つい頼れる相棒である Google Apps Script ( GAS ) に手を伸ばします。
GAS は非常に強力で、外部連携や自動化には不可欠な存在です。しかし、シート内のデータの計算や加工に関しては、 GAS を使わずに 「最新の標準関数」 を使ったほうが、実行速度が速く、保守コストも下がるケースが増えています。
今回は、スプレッドシートを扱うスキルレベルを再定義し、 GAS という強力な武器を持ちつつも、あえて標準機能でシンプルに解決する 「機能美」 を追求する方法 ( BYROW 関数, BYCOL 関数 ) をご紹介します。
スプレッドシート使いの「レベル別」階級
あなたは普段、どのスタイルでスプレッドシートと向き合っていますか?
Lv 1 . ベタ書きの修行僧
- 手法 : セルに直接データを書き入れ、一つひとつ手作業で装飾する。
- 特徴 : 全てのセルに入力し切る「マンパワー」と「精神力」が求められる。
- 評価 : ある意味、やり込み要素としては最上位。
Lv 2 . オートフィルの使い手
- 手法 : 書式や数式を一つ作り、行方向・列方向に「オートフィル (ドラッグ) 」する。
-
特徴 : 相対参照 (
A1) と絶対参照 ($A$1) とを自在に操る。 - 評価 : 実務で最もよく見るスタイル。ただし、行が増えるたびにドラッグし直す手間が残る。
Lv 3 . 整形の達人
- 手法 : 「入力規則」で不正なデータを排除し、「条件付き書式」で視認性を高める。
- 特徴 : 受け手が使いやすい状態でお渡しできる。
- 評価 : 多くのビジネスパーソンにとっての到達点。非常に扱いやすいシートを作る。
Lv 4 . GAS の魔術師
- 手法 : 標準機能の枠を超え、スクリプト ( GAS ) で自在に処理する。
- 特徴 : メニュー作成、外部 API 連携、定期実行など、スプレッドシートを「アプリケーション」へと進化させる。
- 評価 : なんでもできるマスター・オブ・マスター。
Lv 5 . シンプル・イズ・ベストの賢者 (今回の方針)
- 手法 : GAS で書くべき部分と、関数で済む部分を完全に見極める。計算ロジックは 『セル 1 個』に集約 し、 GAS の負担を減らす。
- 特徴 : 高速な関数を使いこなし、保守性を極限まで高める。
- 評価 : 「書けるけれど、あえて書かない」。技術の使い所を知り尽くした真の限界突破。
本論:なぜ GAS ではなく 『セル 1 個』 なのか?
GAS は万能ですが、「セルの値を読んで、計算して、書き込む」という処理においては、以下のオーバーヘッドが発生します。
- スクリプトの実行トリガーや権限設定が必要
- 大量のデータ処理 (
getValues関数 /setValues関数 ) における実行時間の壁 - コードが見えないため、属人化しやすい
一方で、Lv. 2 のオートフィル運用も「行追加のたびにコピペが必要」という弱点があります。
そこで提案したいのが、BYROW 関数と BYCOL 関数です。 これらは GAS のようにロジックを記述でき、かつオートフィルでコピペした状態よりも軽く動作します。
これまでの常識
A1 に数式を書いて、A1000 までドラッグする
これからの常識
A1 にロジックを書くと、勝手に A1000 まで値が埋まる (スピルする)
これを実現する具体的な書き方を見ていきましょう。
実践テクニック
ケース1 : A 列の値に「 +1 」して B 列に出す
オートフィルも、onEdit トリガーの GAS も不要です。B1 セルに以下の 1 行を書くだけで完了します。
数式
=BYROW(A1:A, LAMBDA(x, IF(ISBLANK(x), "", x+1)))
解説
-
BYROW(A1:A, ...):A列全体を1行ずつ処理します。 -
LAMBDA(x, ...): その行の値を「変数x」と名付けます。 ( GAS の変数定義に近い感覚です) -
IF(ISBLANK(x), "", x+1): もしx(A列) が空なら、何もしない (空文字) 。値が入っていれば、x+1を計算する。
これだけで、A 列に追記するたびに、B 列がリアルタイムで更新されます。
ケース2 : 複数列 ( A 列と B 列 ) を使って C 列に出す
「 A 列と B 列を足して C 列に」といった処理も、LET 関数と INDEX 関数を組み合わせることで、まるでコードを書くように記述できます。
数式
=BYROW(A1:B, LAMBDA(row, LET(
val_a, INDEX(row, 1, 1),
val_b, INDEX(row, 1, 2),
result, val_a + val_b,
IF(val_a="", "", result)
)))
解説
GAS を書く方なら、この構造の読みやすさに気づくはずです。
-
BYROW(A1:B, ...):A列とB列のセットを 1 行ずつrowという変数で受け取ります。 -
LET(...): ここでローカル変数を定義します。-
val_a: 1 列目 (A列 ) の値 -
val_b: 2 列目 (B列 ) の値 -
result: 計算結果
-
-
最後に
IFで空判定をして出力。
セル参照 ( A1 , B1 ...) が散らばらず、ロジックが一箇所にまとまっているため、後から修正する場合もこのセルを見るだけで済みます。
まとめ: GAS と関数の「幸せな共存」
今回紹介した BYROW 関数 (BYCOL 関数も同様 ) を使うことで、シート内のデータ処理は劇的にシンプルになります。
- GAS に任せること : 外部API連携、複雑なトリガー実行、シートの生成など。
- 関数に任せること : データの加工、計算、整頓。
「 GAS を使わない」のではなく、「 GAS を使うまでもない処理は、モダンな関数でサクッと片付ける」 。 これによってシート自体が軽くなり、結果として GAS 側で処理すべきタスクも明確になります。
今後は、 GAS という強力な武器を懐に忍ばせつつ、「Lv 5 . シンプル・イズ・ベストの賢者」 として、スマートなシート構築を目指してみませんか。
次回は ackyla さんです!