2
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スプレッドシートは『セル1個』で制御する

Last updated at Posted at 2025-12-24

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)))

解説

  1. BYROW(A1:A, ...) : A 列全体を1行ずつ処理します。
  2. LAMBDA(x, ...) : その行の値を「変数 x」と名付けます。 ( GAS の変数定義に近い感覚です)
  3. 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 を書く方なら、この構造の読みやすさに気づくはずです。

  1. BYROW(A1:B, ...) : A 列と B 列のセットを 1 行ずつ row という変数で受け取ります。

  2. LET(...) : ここでローカル変数を定義します。

    • val_a: 1 列目 ( A 列 ) の値
    • val_b: 2 列目 ( B 列 ) の値
    • result: 計算結果
  3. 最後に IF で空判定をして出力。


セル参照 ( A1 , B1 ...) が散らばらず、ロジックが一箇所にまとまっているため、後から修正する場合もこのセルを見るだけで済みます。

まとめ: GAS と関数の「幸せな共存」

今回紹介した BYROW 関数 (BYCOL 関数も同様 ) を使うことで、シート内のデータ処理は劇的にシンプルになります。

  • GAS に任せること : 外部API連携、複雑なトリガー実行、シートの生成など。
  • 関数に任せること : データの加工、計算、整頓。

「 GAS を使わない」のではなく、「 GAS を使うまでもない処理は、モダンな関数でサクッと片付ける」 。 これによってシート自体が軽くなり、結果として GAS 側で処理すべきタスクも明確になります。

今後は、 GAS という強力な武器を懐に忍ばせつつ、「Lv 5 . シンプル・イズ・ベストの賢者」 として、スマートなシート構築を目指してみませんか。


次回は ackyla さんです!

2
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
2
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?