即時関数で変数のスコープを絞る

更新:2026-10-04,作成:2026-09-13

はじめに

例えば,以下のソースはGoogle SpreadsheetのA列にあるメールアドレスを取得している.

function myFunction() {
  const sheet=SpreadsheetApp.openById('xxx').getSheets()[0];
  const lastRow=sheet.getLastRow();
  const to=sheet.getRange(1, 1, lastRow, 1).getValues().join(',');
  Logger.log(to);
}

変数sheetとlastRowはtoに値を設定したらもう使わない.しかし,関数全体で参照可能である.以下のように,toに値を設定する時だけスコープを持てれば良いのにと思っていた.ちなみに,このソースは動かない(オブジェクトリテラルと判定されて構文エラーになる).念のため.

function myFunction() {
  const to={
    const sheet=SpreadsheetApp.openById('xxxxx').getSheets()[0];
    const lastRow=sheet.getLastRow();
    return sheet.getRange(1, 1, lastRow, 1).getValues().join(',');
  };
  Logger.log(to);
}

結論

Geminiに聞いたら,即時関数(IIFE:Immediately Invoked Function Expression)を教えてくれた.これならsheetとlastRowのスコープを狭くできる.

function myFunction() {
  const to=(()=>{
    const sheet=SpreadsheetApp.openById('xxx').getSheets()[0];
    const lastRow=sheet.getLastRow();
    return sheet.getRange(1, 1, lastRow, 1).getValues().join(',');
  })();
  Logger.log(to);
}

追記(2026-10-04)

変数toを再代入可能(constではなくlet)で宣言する必要はあるが,ブロックスコープを使う方法もある.

function myFunction() {
  let to;
  {
    const sheet=SpreadsheetApp.openById('xxx').getSheets()[0];
    const lastRow=sheet.getLastRow();
    to=sheet.getRange(1, 1, lastRow, 1).getValues().join(',');
  }
  Logger.log(to);
}

環境

  • Google Apps Script