🍎

Google Sheetsでfill blank

2023/09/01に公開

Google Sheets関数: fill_blank_by_upper

Google Sheetsでデータを扱っていると、欠損値や空白がある場合があります。特にセル結合を用いた表では、値は左上にしか入らないため下のような欠損値を含む表となってしまいます。

A B
1 red apple
2 strawberry
3 yellow banana
4 lemon
5 green asparagus

このfill_blank_by_upper関数は、カラム内の欠損値をそのカラムの直上の非欠損値で埋めるための関数です。

対象読者

Google Sheetsで上記のような欠損値入りのデータをlambda関数で処理したいと思っている方

パラメータ

パラメータ 説明
range 埋めるセルの範囲。

=fill_blank_by_upper(A1:B5)

元のデータ

A B
1 red apple
2 strawberry
3 yellow banana
4 lemon
5 green asparagus

結果

A B
1 red apple
2 red strawberry
3 yellow banana
4 yellow lemon
5 green asparagus

実装

lambda(
  range,
  let(
    fill_col_blank,lambda(
      col,
      scan(
        ,
        col,
        lambda(
          prev,
          current,
          if(
            isBlank(current),
            prev,
            current
          )
        )
      )
    ),
    byCol(range,fill_col_blank)
  )
)

この関数の実装は、lambdaを用いていて、具体的な動作は以下の通りです:

  1. fill_col_blankでは1列のデータを対象に欠損値を埋めます。
  2. scan関数は、カラムのデータを上から下へと順に走査し、前回の値(prev)と現在の値(current)を比較します。
  3. if(isBlank(current), prev, current)の部分で、現在のセルの値が空白(欠損値)であれば、前回の値(直上のセルの値)を返し、そうでなければ現在の値を返します。
  4. これをカラムの最後まで繰り返し、欠損値を埋めたカラムのデータを生成します。
  5. byColを用いて全ての行を処理します。

名前付き関数として登録する場合は、パラメータとしてrangeを登録した上で、以下を関数の本体として登録してください

=let(
    fill_col_blank,lambda(
      col,
      scan(
        ,
        col,
        lambda(
          prev,
          current,
          if(
            isBlank(current),
            prev,
            current
          )
        )
      )
    ),
    byCol(range,fill_col_blank)
  )

この関数を用いれば、セル結合のせいで欠損値がある表も簡単に扱うことができます。

Discussion