即時関数で変数のスコープを絞る
更新: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