最新のExcelやGoogle Spreadsheetで導入されたLET関数は本質的に、プログラミング言語におけるプロシージャ/関数のローカルブロック(または無名関数の即時実行)そのものです。

Google Spreadsheetの関数の利用法を解説するサイトは多すぎて困ります。
お勧めは 便利なGoogle スプレッドシート関数一覧!基本から独自関数まで
少し古いので、XLOOKUP関数が入っていません。新しい関数の利用はGeminiに目的を指示すれば提供される中に含まれます。

そして、Google Spreadsheetには膨大な数の関数があり、その一覧と使い方の詳細が公開されています。Excelには存在しないsortnなどの便利な関数もあります。
https://support.google.com/docs/table/25273

具体的には、プログラミング言語における以下のような構造を数式1つで実現しています。

そして最も重要なことは、「AIのGeminiなどに、目的を説明すると、そのままで使えるプログラムを提案してくれること」!

 ほとんどプログラミングの知識がなくとも、使えるプログラムができるため、その動作検証や目的に沿っているかの応答をGeminiと重ね、内容の逐次解説を要求することで、申し送りができるのだ。
 それこそ、現代のAI利用法そのもの。
 そして、このプログラムの利用は、PythonやVisual Basic や 難解なJava などを学ぶ必要がなく、職場で使ってるExcel(Microsoft Office)や無料で使えるGoogle Spreadsheetだけでよい。

LET関数のプログラミング的構造

例えば、次のような疑似コード(JavaScriptやPython等)をイメージすると、LET関数の挙動が正確に捉えられます。

JavaScript (Pythonやプログラム言語各種もほぼ同等)

// 疑似コードでの表現
{
let a = 10;            // 1. 変数宣言と代入
let b = a * 2;         // 2. 直前の変数aを利用して次の変数を定義
let c = b + 5;         // 3. さらに直前の変数bを利用
return a + b + c;      // 4. 最後の評価式が「戻り値」になる
}

これをGoogleスプレッドシートのLET関数で書くと、全く同じ構造になります。

Plaintext

=LET(
a, 10,
b, a * 2,
c, b + 5,
a + b + c
)

 

ExcelやGoogle SpreadsheetのLET関数の2つの重大な本質

LET関数は、そのセル限りの独自関数宣言と関数の即時実行を行う。
関数内容は、ExcelやGoogle Spreadsheetの基本機能を総動員でき、作成した関数の戻り値が即実行されるということが、最も重要な特徴だ。

別シートの内容を全て取り込み、特定の列とマスタの値を対応させ、SQLと同等のことを行わせ、結果を戻り値にできる。これは一例だ。

通常のプログラムならば、CSVに書き出し、それを読み込み、マスタと照合しマスタデータを付加し、判断し選択抽出し計算し合計し、それをCSVに書き出し、スプレッドシートに読み込むなどという、データベースとスプレッドシートの連携機能を一つのセルの中で関数宣言して実行して実現できてしまう。

1. 「変数宣言・代入」の列と、最後の「戻り値」という構造

LET関数の引数は、偶数個の「 変数名, 代入値/計算式 」のペアを並べた後、最後の1つの引数が「ブロック全体の評価結果(戻り値)」になります。

  • 奇数番目の引数(1, 3, 5…): 変数名( let 宣言)
  • 偶数番目の引数(2, 4, 6…): その変数に代入する式や値( = ...
  • 最後の1つの引数: 関数全体が最終的に返す値( return ...

単なる「数式の置き換えテクニック」ではなく、数式の中にローカル変数のスコープを閉じ込めて評価結果を返すという点が本質です。

2. 上から順に評価され「前に宣言した変数を、後ろの宣言で参照できる」

LET関数の変数定義は上から下(左から右)へ順番に評価されるため、後続の変数定義の中で、それより前に定義した変数をそのまま利用できます。

Plaintext

=LET(
price, 1000,
tax_rate, 0.1,
tax, price * tax_rate,        // ← 前で定義した price と tax_rate を使用
total, price + tax,          // ← 前で定義した price と tax を使用
total                        // ← 最終的な戻り値
)

この逐次評価の仕組みがあるからこそ、複雑な多段階の計算ステップを、作業セルを使わずに1つの数式内へ美しくカプセル化できます。

この「プログラミング言語のローカルブロック(変数宣言列+評価戻り値)」という観点で整理されたプログラマー向け・高度ユーザー向けの解説としては、Qiitaなどの技術系Webサイトの記事が適しています。

この特徴を利用し、MAP関数(行の逐次処理)やLAMBDA関数と組み合わせると、強力なプログラムを作ることができます。

紹介した利用例で解説

以前作成したLET関数で、動作したものだが、LET関数の中で、MAP関数とLAMBDA関数が使われている。

この中では、前に定義がないemailという名前が出てきて、その値が与えられているようには見えないがどういうことか?
以下 赤字=関数、 青字=名前
   先の行で定義した名前は、次の行以降は定数や値として利用できる。
   関数は、引数として (操作対象、処理1、処理2,・・・) を取る

=LET(

  form_url, “参照先のGoogleスプレッドシートのID”,

  header_raw, IMPORTRANGE(form_url, “‘フォームの回答 1’!A1:H1”),

  header_master, IMPORTRANGE(form_url, “マスター!B1:K1”),

  raw, FILTER(

    IMPORTRANGE(form_url, “‘フォームの回答 1’!A2:H”), 

    INDEX(IMPORTRANGE(form_url, “‘フォームの回答 1’!A2:A”),,1) <> “”

  ),

  sorted, SORT(raw, 1, FALSE),

  latest, SORTN(sorted, 9999, 2, 2, FALSE),

  combined, HSTACK(

    latest,

    MAP(INDEX(latest,,2), LAMBDA(email, XLOOKUP(

      email

      IMPORTRANGE(form_url, “マスター!A:A”), 

      IMPORTRANGE(form_url, “マスター!B:K”), 

      “未登録”

    )))

  ),

  data_sorted, SORT(combined, 18, TRUE),

  VSTACK(

    HSTACK(header_raw, header_master),

    data_sorted

  )

)

ご提示いただいた数式について、ご質問への回答と逐次解説を行います。

 

1. 「 email
という定義が見当たらないのに動くのはなぜか?」

結論から申し上げますと、 email は LAMBDA 関数(およびそれを呼び出す MAP 関数)によって、その場で一時的に作られた変数(仮引数) だからです。事前にどこかで定義されている必要はありません。

該当の箇所を見てみましょう:

Google Spreadsheet

MAP(INDEX(latest,,2), LAMBDA(email, XLOOKUP(email, ...)))

 

動作の仕組み

  1. MAP(配列, LAMBDA(...))
    の役割
    : MAP
    関数は、第一引数に渡された配列(ここでは INDEX(latest,,2)
    つまりメールアドレスが入っている列)から、1要素ずつ順番に取り出して処理を繰り返し行う関数です。
  2. LAMBDA(email, ...)
    の役割
    : LAMBDA
    は「自分で作る使い捨ての関数」を定義するものです。 ここで書かれている LAMBDA(email, XLOOKUP(email, ...))
    は、「取り出した1つの値を一時的に email
    と名付け、その email
    を使って XLOOKUP
    を実行する」
    という処理手順の定義です。

つまり、 MAP
が列の上から下まで1行ずつ巡回する際に、「今処理している1行分のメールアドレス」 を自動的に email
という変数に当てはめて XLOOKUP
に渡してくれているため、事前に定義がなくても正常に動作します。

(※ email
という名前は任意です。例えば LAMBDA(x, XLOOKUP(x, ...))
のように x
addr
などの別の名前に変更しても全く同じ動作になります。)

 

2. 数式の逐次解説

この LET
関数は、「フォームの回答データから最新の回答のみを抽出し、メールアドレスをキーにしてマスター情報の該当データを横に結合した上で、並べ替えて表示する」 という処理を行っています。

ステップ順(定義されている順番)に解説します。

 

form_url

Google Spreadsheet

form_url, "参照先のGoogleスプレッドシートのID"
  • 意味: 参照先のGoogleスプレッドシートのID(URLの一部)を変数 form_url
    に格納します。以降の IMPORTRANGE
    で使い回すためのものです。

 

header_raw

Google Spreadsheet

header_raw, IMPORTRANGE(form_url, "'フォームの回答 1'!A1:H1")
  • 意味: フォーム回答シートの1行目(ヘッダー/見出し:A1〜H1)を取得します。

 

header_master

Google Spreadsheet

header_master, IMPORTRANGE(form_url, "マスター!B1:K1")
  • 意味: マスターシートの1行目(見出し:B1〜K1)を取得します。

 

raw

Google Spreadsheet

raw, FILTER(
IMPORTRANGE(form_url, "'フォームの回答 1'!A2:H"), 
INDEX(IMPORTRANGE(form_url, "'フォームの回答 1'!A2:A"),,1) <> ""
)
  • 意味: フォーム回答のデータ本体(A2〜H列)で2行目以降の全データを取得し、A列(タイムスタンプなど)が空白でない行のみにフィルタリングして不要な空行を除外します。

 

sorted

Google Spreadsheet

sorted, SORT(raw, 1, FALSE)
  • 意味: 取得した回答データ raw
    を、第1列(タイムスタンプ)を基準にして降順(新しい順:FALSE)に並べ替えます。

 

latest

Google Spreadsheet

latest, SORTN(sorted, 9999, 2, 2, FALSE)

SORTN 関数の引数の詳細

SORTN 関数は「並べ替えと重複除去を同時に行う関数」

SSORTN(並べ替え行う範囲, [取得行数n], [重複を表示する・しない], [重複判定列番号], [昇順フラグ1], ...)

各引数をあてはめると以下の通りです:

  1. sorted (範囲の名前):前の行で処理対象のデータをタイムスタンプで並べ替えた後のもの
  2. 9999 (n):返す最大行数(全件取得するため大きな数を指定)。
  3. データ選択方法重複を表示する・しないモード( 2 = 一意の行のみ、 0 = 全て)。
  4. 重複判定列:第2列目(メールアドレス列)を基準にして重複を判定
     同じものが出てきた場合は重複として2件目以降は捨てる
  5. 並べ替え方法(昇順か降順か):降順(FALSE)=新しいタイムスタンプが大で上に

 このsortn関数で、全データで重複があったら最新だけを選択し返り値とし返す。

combined

Google Spreadsheet

combined, HSTACK(
latest,
MAP(INDEX(latest,,2), LAMBDA(email, XLOOKUP(
email, 
IMPORTRANGE(form_url, "マスター!A:A"), 
IMPORTRANGE(form_url, "マスター!B:K"), 
"未登録"
)))
)
  • 意味: 最新回答 latest
    の右側に、マスターから引きあわせた情報を横に結合 ( HSTACK
    )
    します。

    • MAP
      LAMBDA
      を使い、メールアドレスを1件ずつ email
      として処理します。
      =MAP(配列1, [配列2, …], LAMBDA(変数1, [変数2, …], 実行する計算式))
      Google スプレッドシートの MAP(マップ)関数 は、指定した配列(範囲)のデータを 1つずつ取り出して処理(ループ処理)し、その結果を元の形に合わせて一括で返してくれる。
    • INDEX(latest,,2)
      で最新回答の第2列(メールアドレスのリスト)を取り出します。
    • 取り出した第2列のデータ(メールアドレス)を LAMBDA関数に名前emailとして引き渡す。LAMDA関数で定義された次の式が実行される。
    • 関数(XLOOKUP や AND/OR 条件など)を配列全体に適用したい場合に強力な効果を発揮します。
      変数1, 変数2…: 配列から1つずつ取り出された値が入る「仮の箱(名前)」です(x, item, val など自由に命名可能)。

    • XLOOKUP
      は、 email
      を「マスターシートのA列」から探し、一致する行の「B〜K列の情報」を取得します(見つからない場合は "未登録"
      )。
      =XLOOKUP(検索値, 検索範囲, 結果の範囲, [見つからない場合], [一致モード], [検索モード])
      =IMPORTRANGE(“別のスプレッドシートのURL(またはID)”, “シート名!範囲”)

 

data_sorted

Google Spreadsheet

data_sorted, SORT(combined, 18, TRUE)
  • 意味: 結合完了したデータ combined
    全体を、第18列目を基準にして昇順(A-Z順/小さい順:TRUE)に並べ替えます。 (※回答データ8列 + マスターデータ10列 = 計18列目。つまりマスター側の特定の列などを基準に最終ソートを行っています。)

 

⑨ 最終出力(出力部)

Google Spreadsheet

VSTACK(
HSTACK(header_raw, header_master),
data_sorted
)
  • 意味: 最終的な表を作成してセルに出力します。
    • 上段: フォームの見出し ( header_raw
      ) とマスターの見出し ( header_master
      ) を横に繋げたヘッダー行。
    • 下段: 並べ替え済みのデータ本体 ( data_sorted
      )。
    • これらを VSTACK
      縦に結合して完成させます。