GAS『ReferenceError: Function is Not Defined』の原因と対処法
- 作成日 2025.10.08
- その他
Apps Scriptで「関数が定義されていない」とされるときは、参照した関数名が読み取り時点のスコープに存在しない。スペルや大文字小文字、ローカル関数化、IIFE/ブロック内定義、HTML側からの呼び出し名不一致、トリガーやデプロイの参照先ずれなどが主な原因。発生条件の整理とすぐ使える修正パターンをまとめる。
目次
- 1. エラーの意味と代表メッセージ
- 2. 発生条件の早見表
- 3. まずやること:ファイル・名前・大文字小文字を点検
- 4. ケース1:関数名のタイポ・全角混入・大文字小文字の相違
- 5. ケース2:スコープの問題(ローカル/IIFE/ブロック内定義)
- 6. ケース3:HTML→サーバ呼び出し(google.script.run)の不一致
- 7. ケース4:トリガー/ウェブアプリのエントリ名が誤り
- 8. ケース5:ライブラリ/ clasp/デプロイの版ずれ
- 9. ケース6:this/メソッド参照でコンテキストが失われる
- 10. ケース7:モジュール風の書き方で露出していない
- 11. ケース8:保存漏れ・シンタックスエラー後の部分実行・ビルド途中
- 12. 迅速な切り分けテンプレ
- 13. よくあるNG→OK(まとめスニペット)
- 14. 通し例(NG→OK:HTMLサービス)
- 15. チェックリスト
エラーの意味と代表メッセージ
ReferenceError: myFunc is not defined
ReferenceError: Function is not defined
ReferenceError: doPost is not defined
ReferenceError: onEdit is not defined・実行箇所から見えるグローバル空間に、呼び出した関数名が無い。
・V8ランタイムではファイルは同一グローバルで評価されるが、関数をブロックやIIFE内に置くと外から見えなくなる。
発生条件の早見表
□ 関数名のタイポ/全角混入/大文字小文字違い(myfunc vs myFunc)
□ 関数をローカルスコープ(function 内/{} ブロック/IIFE)で定義している
□ HTML側 google.script.run でサーバ関数名が一致していない
□ トリガー/ウェブアプリのエントリ名(onOpen/onEdit/doGet/doPost)が不正
□ ライブラリ/ clasp で未デプロイの古い版を参照している
□ this を期待したメソッド参照でコンテキストが失われた
□ 非公開モジュール化(const myFunc = … を export していない想定のコード)まずやること:ファイル・名前・大文字小文字を点検
// 1. エディタで「関数を検索」して物理的に存在するか確認
// 2. 呼び出し箇所と定義箇所のスペル/大文字小文字が一致しているか
// 3. 「保存」→ 実行。デプロイ(ウェブアプリ/ライブラリ)なら最新版に更新・多くはスペル/保存漏れ/旧バージョン参照。まずここから潰す。
ケース1:関数名のタイポ・全角混入・大文字小文字の相違
// NG(大文字小文字の不一致)
function myFunc() {}
function run() { myfunc(); } // ReferenceError
// OK(完全一致)
function myFunc() {}
function run() { myFunc(); }
// NG(全角混入)
function doPost(e) { /* ... */ }
function test() { doPost({}); } // P が全角 → ReferenceError
// OK:半角のみ・コピペで統一・日本語IME切替直後の全角英字が混ざる例が多い。見た目が似ていても別文字。
ケース2:スコープの問題(ローカル/IIFE/ブロック内定義)
// NG:IIFE内の関数は外から見えない
(() => {
function hidden() {}
})();
function run() { hidden(); } // ReferenceError
// OK:グローバル関数として定義
function visible() {}
function run() { visible(); }
// NG:ブロックスコープ内の関数
{
function localOnly() {}
}
function run2() { localOnly(); } // ReferenceError・Apps Scriptで呼び出すエントリはグローバルに置く。
ケース3:HTML→サーバ呼び出し(google.script.run)の不一致
// Code.gs(サーバ側)
function addRow(values) {
const sh = SpreadsheetApp.getActiveSheet();
sh.appendRow(values);
}
// index.html(クライアント側)
<script>
function send() {
const values = ['A','B','C'];
google.script.run
.withSuccessHandler(() => alert('done'))
.addRow(values); // ← サーバの関数名と一致させる
}
</script>
// NG例:HTML側が .addrow と書く → ReferenceError: addrow is not defined(サーバ側で未定義)
・HTMLで呼ぶ関数は「.gs のグローバル関数」。クラス内やローカル関数は不可。
ケース4:トリガー/ウェブアプリのエントリ名が誤り
// NG:onedit は無効(大文字小文字が違う)
function onedit(e) { /* ... */ } // 実行されず、呼び出すと ReferenceError 場面あり
// OK:正式名
function onEdit(e) { /* ... */ }
// ウェブアプリ
function doGet(e) { return HtmlService.createHtmlOutput('ok'); }
function doPost(e) { return ContentService.createTextOutput('ok'); }
// NG:エントリ未定義なのにURLにPOST → ReferenceError: doPost is not defined
・シンプルトリガー名は厳密一致。インストール型トリガーも対象関数名の完全一致が必要。
ケース5:ライブラリ/ clasp/デプロイの版ずれ
// 例:ライブラリ A の v1 を追加しているが、v2で myFunc が追加された
// スクリプト側は A.myFunc() を呼ぶが、プロジェクト設定は v1 のまま → ReferenceError
// 対処:
/*
1) プロジェクト設定 → ライブラリ → 参照バージョンを更新
2) clasp を使うなら `clasp push` の後にエディタ側でリロード
3) ウェブアプリは「新バージョンとしてデプロイ」→ URLを最新に
*/・デプロイ更新を忘れると、実行環境には古いコードが残る。
ケース6:this/メソッド参照でコンテキストが失われる
const svc = {
name: 'S',
run() { return this.name; }
};
// NG:関数だけを取り出して呼ぶと this が失われる
const f = svc.run;
function main() { Logger.log(f()); } // this=undefined → TypeError or 意図しない動作
// 呼び出し側で「未定義関数」を指すケース
const calls = { run: svc.run };
function main2() { calls.run(); } // this=calls → svc.run 内で this が異なる
// 安全策:bind で束縛するか、静的関数にする
const fb = svc.run.bind(svc);
function main3() { Logger.log(fb()); }・ReferenceErrorではなくTypeErrorになることもあるが、関数参照の取り回しで“呼べない名前”になることがある。
ケース7:モジュール風の書き方で露出していない
// NG:関数式をローカル定数に閉じて露出なし
const helper = () => 'ok';
const main = () => helper();
// エディタの関数実行UIから main は見えるが、HTMLから google.script.run.main() を呼ぶのはOK。
// しかし html → helper() を直接呼ぶことはできない(グローバル未公開)。
// 公開したいものは function 宣言でトップレベルに
function helperPub() { return 'ok'; }・トップレベル function 宣言であればグローバルに載る。公開/非公開を設計する。
ケース8:保存漏れ・シンタックスエラー後の部分実行・ビルド途中
// 典型
/*
・別ファイルで構文エラー(未保存)→ 実行環境に最新が反映されず古い版が走る
・結果として、呼ぶはずの関数が存在しない状態で実行され ReferenceError
*/
// 対処
// 1) すべて保存(⌘/Ctrl+S)
// 2) エディタの「デプロイ」>「新バージョンとしてデプロイ」を実施(ウェブアプリ/アドオン)
// 3) ランタイムログを確認して構文エラーがないことを確認・保存とデプロイの反映を習慣化。
迅速な切り分けテンプレ
// 1) どの名前で落ちているかログに出す
function call(name) {
if (typeof this[name] !== 'function') {
throw new Error(`関数が見つかりません: ${name}`);
}
return this[name]();
}
// 2) 一覧を出して目視(グローバルの関数名を列挙)
function listGlobals() {
const keys = Object.keys(this).filter(k => typeof this[k] === 'function');
Logger.log(JSON.stringify(keys.sort()));
}・「あるはずの関数がグローバルに見えているか」を先に確認。
よくあるNG→OK(まとめスニペット)
// NG:名前不一致
function addRow() {}
function run() { addrow(); } // x
// OK
function addRow() {}
function run() { addRow(); }
// NG:HTML側の呼び出し名違い
// -> index.html から .addrow() で呼ぶ
// OK:.addRow() に統一
// NG:IIFE内で定義
(() => { function handler() {} })();
function doGet() { return HtmlService.createHtmlOutput(handler()); } // x
// OK:グローバル化
function handler() { return 'OK'; }
function doGet() { return HtmlService.createHtmlOutput(handler()); }
通し例(NG→OK:HTMLサービス)
// Code.gs(NG)
function doGet() {
return HtmlService.createHtmlOutputFromFile('index');
}
(function() {
function save(data) { /* ... */ } // IIFE内 → グローバル未公開
})();
// index.html(クライアント)
<script>
function submit() {
google.script.run.save({x:1}); // ReferenceError: save is not defined
}
</script>
// 修正(OK)
function doGet() {
return HtmlService.createHtmlOutputFromFile('index');
}
function save(data) { /* ... */ } // グローバルに公開
// index.html
<script>
function submit() {
google.script.run.withSuccessHandler(() => alert('saved')).save({x:1});
}
</script>チェックリスト
□ 呼び出し名と定義名は完全一致か(大文字小文字/全角混入なし)
□ 関数はトップレベル(グローバル)にあるか(IIFE/ブロック内に閉じていないか)
□ HTML→サーバの google.script.run で関数名が一致しているか
□ トリガー/ウェブアプリのエントリ名(onOpen/onEdit/doGet/doPost)は正しいか
□ ライブラリ/デプロイのバージョンは最新か(参照更新したか)
□ this を必要とするメソッド参照は bind 済みか
□ すべて保存し、構文エラーが残っていないか(デプロイも更新)-
前の記事
GAS『TypeError: Cannot Read Property』の原因と対処法 2025.10.07
-
次の記事
GAS『Exceeded Maximum Execution Time』の原因と対処法 2025.10.09
コメントを書く