GASで「TypeError: Cannot read properties of undefined (reading 'getRange')」が発生する原因と解決策
最終更新日: 2026-08-27
30秒でわかる原因と解決策
原因:
SpreadsheetApp.openById()やsheet.getSheetByName()で存在しないIDやシート名を指定したため、戻り値がundefinedになり、その状態でgetRange()を呼び出したため。 解決策: スプレッドシートIDやシート名が正しいか確認する。または、現在アクティブなシートを操作する場合はSpreadsheetApp.getActiveSpreadsheet().getActiveSheet()を使用する。
修正コード(Before / After)
❌ エラーが発生するコード
function myFunction() {
// 存在しないスプレッドシートIDやシート名、あるいはタイポがあると失敗する
var ss = SpreadsheetApp.openById("invalid_spreadsheet_id");
var sheet = ss.getSheetByName("存在しないシート");
// sheet が undefined のため、ここでエラーが発生する
var range = sheet.getRange("A1");
Logger.log(range.getValue());
}
⭕ 修正後の推奨コード
function myFunction() {
// 現在開いているアクティブなスプレッドシートとシートを取得する場合
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
// または、IDやシート名を指定して安全に取得する場合
// var ss = SpreadsheetApp.openById("正しいスプレッドシートID");
// var sheet = ss.getSheetByName("正しいシート名");
// if (!sheet) {
// throw new Error("指定したシートが見つかりません。");
// }
var range = sheet.getRange("A1");
Logger.log(range.getValue());
}
よくある発生パターンと解説
1. getSheetByName() の引数のタイポ(誤字・脱字)
最も多い原因は、getSheetByName("シート1") のように指定した文字列が、実際のGoogleスプレッドシートのタブ名と一致していないケースです。前後に不要なスペースが含まれている場合も undefined になります。
2. openById() の対象外ファイルや権限エラー
SpreadsheetApp.openById() を使用する際、指定したIDが間違っているか、スクリプトを実行しているアカウントにそのスプレッドシートへのアクセス権限がない場合、オブジェクトが正しく取得できずにエラーとなります。
3. トリガー実行時の getActiveSpreadsheet() の罠
インストール型トリガーや時間主導型トリガーからスクリプトを実行する際、getActiveSpreadsheet() は「コンテキスト(文脈)」を持たないため null や undefined を返すことがあります。トリガーから実行する場合は、必ず openById() を使って明示的にスプレッドシートを指定してください。
よくある質問 (FAQ)
Q. シートが存在しているのにこのエラーが出るのはなぜですか? A. シート名の前後に半角・全角スペースが含まれていないか確認してください。また、コード内の文字列と実際のシート名が完全に一致している必要があります。
Q. エラーを未然に防ぐにはどうすればいいですか?
A. sheet 変数を取得した直後に if (!sheet) などの条件分岐(ガード節)を挟み、undefined の場合にエラーログを出力したり処理を中断させたりすることで、予期せぬクラッシュを防ぐことができます。