🩹 Cheat Sheet
GASエラー逆引き辞典
Google Apps Scriptでよく出るエラー25項目を、原因・解決コード・詳細記事リンクと合わせて逆引きできる辞典ページ。 本ページをブックマークしておけば、次のエラー遭遇時に検索時間ゼロで解決できます。
🔍 エラーを探すコツ: ブラウザで Ctrl+F (Macは ⌘+F)→ エラー文の一部を貼り付けて検索すると即座にヒットします。
🔐 認証・権限系
初回実行・OAuth・スコープ関連のエラー
Exception: Authorization is required to perform that action
🔎 原因: GASプロジェクトが初回実行時にGoogleサービスへのアクセス権限を要求しているが、未承認
✅ 解決策: GASエディタで手動で1回関数を実行し、権限承認ダイアログで「許可」をクリック
💻 コード例:
// 初回はエディタで [▶ 実行] を手動クリックして権限承認
function init() {
SpreadsheetApp.getActiveSpreadsheet(); // これで権限要求が発生
} Exception: You do not have permission to access the requested document
🔎 原因: スプシ/ドライブへのアクセス権がGoogleアカウントに付与されていない
✅ 解決策: 対象ファイルの「共有」設定で、実行アカウントに閲覧/編集権限を付与
💻 コード例:
// 権限エラーになったら
const ss = SpreadsheetApp.openById('XXX'); // 失敗
// → ファイルのオーナーから「編集者」として共有してもらう GoogleJsonResponseException: insufficient authentication scopes
🔎 原因: 実行しようとしているAPIに必要なOAuthスコープが宣言されていない
✅ 解決策: appsscript.json の oauthScopes を確認し、必要スコープを追加
💻 コード例:
// appsscript.json に追加
"oauthScopes": [
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/gmail.send"
] 📝 構文・型系
JavaScriptの基本構文・型違反エラー
SyntaxError: Unexpected token
🔎 原因: カンマ・括弧・セミコロン忘れ、文字列クォート未閉じ等の構文エラー
✅ 解決策: エディタの赤波線をたどる。前後の括弧対応を確認
💻 コード例:
// NG
const arr = [1, 2, 3 // ] が抜けている
// OK
const arr = [1, 2, 3]; ReferenceError: XXX is not defined
🔎 原因: 変数名のタイプミス、宣言忘れ、スコープ外参照
✅ 解決策: スペル確認、const/let宣言を追加、スコープを確認
💻 コード例:
function demo() {
if (true) {
const x = 1; // ブロックスコープ
}
console.log(x); // ❌ ReferenceError
} TypeError: Cannot read properties of undefined (reading 'xxx')
🔎 原因: 存在しないオブジェクトのプロパティを参照している
✅ 解決策: オプショナルチェーン ?. を使う、もしくは先にnullチェック
💻 コード例:
// NG
const name = user.profile.name; // userがundefinedだとエラー
// OK
const name = user?.profile?.name ?? '不明'; TypeError: XXX.map is not a function
🔎 原因: 配列でない値に対して配列メソッドを呼び出している
✅ 解決策: Array.isArray() でチェック、必要なら配列化
💻 コード例:
const data = sheet.getRange('A1').getValue(); // 単一値
// ❌ data.map(...)
// ✅ まず配列化
const arr = Array.isArray(data) ? data : [data]; TypeError: Assignment to constant variable
🔎 原因: const で宣言した変数に再代入しようとしている
✅ 解決策: 再代入するなら let を使う。定数に保つなら別変数を作る
💻 コード例:
// NG
const count = 0;
count = count + 1; // ❌
// OK
let count = 0;
count = count + 1; // ✅ SyntaxError: Identifier 'XXX' has already been declared
🔎 原因: 同じ名前の変数を const/let で2回宣言している
✅ 解決策: 別名にするか、再代入するなら let に統一
💻 コード例:
const name = 'A';
const name = 'B'; // ❌ 同名で再宣言不可 ⏱️ API制限・リソース系
実行時間・送信数・クォータ制限
Exception: Script took too long to execute
🔎 原因: 6分(無料版)または30分(有料版)の実行時間制限を超過
✅ 解決策: バッチ分割 + スクリプトプロパティで進捗保存 + トリガー再起動
💻 コード例:
// 進捗を保存して継続
const prop = PropertiesService.getScriptProperties();
let startRow = Number(prop.getProperty('row')) || 1;
// 処理 ...
prop.setProperty('row', nextRow); Exception: Service invoked too many times for one day: email
🔎 原因: Gmail送信の1日上限超過(無料100通/日、Workspace 1500通/日)
✅ 解決策: MailApp.getRemainingDailyQuota() で残数確認、分散送信に変更
💻 コード例:
const remaining = MailApp.getRemainingDailyQuota();
if (remaining < recipients.length) {
// 翌日に回す処理
return;
} Exception: Rate Limit Exceeded
🔎 原因: UrlFetchApp等の外部API連打、短時間に大量呼び出し
✅ 解決策: Utilities.sleep(1000) 挿入、指数バックオフで再試行
💻 コード例:
function fetchWithRetry(url, retries = 3) {
for (let i = 0; i < retries; i++) {
try { return UrlFetchApp.fetch(url); }
catch (e) { Utilities.sleep(Math.pow(2, i) * 1000); }
}
throw new Error('fetch failed');
} Exception: Service using too much computer time for one day
🔎 原因: GAS1日の累積実行時間上限(無料90分/日、Workspace 6時間/日)到達
✅ 解決策: トリガーを減らす、処理を効率化、またはWorkspace契約検討
💻 コード例:
// トリガーの頻度を見直す
// ❌ 1分ごと(1日1440回)
// ✅ 5-10分ごとでも済むケースが大半 📦 リソース・範囲系
シート・範囲・ファイルが見つからない系
Exception: Range not found
🔎 原因: 無効な範囲指定、存在しない行列、getRange の引数ミス
✅ 解決策: 数値で明示的に getRange(1, 1, lastRow, lastCol) を使う
💻 コード例:
// NG: 名前付き範囲が消えているかも
sheet.getRange('MyRange').getValue();
// OK: 数値指定が安全
sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()); Exception: Service Spreadsheets failed while accessing document
🔎 原因: シート名変更、同時編集、API一時エラー
✅ 解決策: getSheetByName() 直後に null チェック、リトライ処理追加
💻 コード例:
const sheet = ss.getSheetByName('在庫');
if (!sheet) throw new Error('シート「在庫」が見つかりません'); Exception: The starting row of the range is too small
🔎 原因: getRange(0, ...) など、1未満の行/列を指定
✅ 解決策: GASのシート座標は1始まり。0ではなく1以上を指定
💻 コード例:
// NG
sheet.getRange(0, 1); // ❌ 行は1以上
// OK
sheet.getRange(1, 1); Exception: Invalid argument: id
🔎 原因: DriveApp.getFileById / SpreadsheetApp.openById のID形式が不正
✅ 解決策: URLの /d/ と /edit の間の部分が正しいIDか確認
💻 コード例:
// URLから抜き出す部分
// https://docs.google.com/spreadsheets/d/[ここがID]/edit
const ss = SpreadsheetApp.openById('1AbCdEf...'); ⏰ トリガー系
時間・イベント主導トリガーのエラー
トリガーが実行されない
🔎 原因: トリガーが削除された、実行上限到達、エラーで自動無効化
✅ 解決策: ScriptApp.getProjectTriggers() で一覧確認、「トリガー」ページでエラー履歴を見る
💻 コード例:
function listTriggers() {
const triggers = ScriptApp.getProjectTriggers();
triggers.forEach(t => console.log(t.getHandlerFunction()));
} Exception: Too many triggers set for this user
🔎 原因: GASプロジェクト内のトリガー数が上限(20件/スクリプト)を超過
✅ 解決策: 不要なトリガーを削除。ScriptApp.deleteTrigger で整理
💻 コード例:
// 重複トリガー削除
ScriptApp.getProjectTriggers()
.filter(t => t.getHandlerFunction() === 'oldFunction')
.forEach(t => ScriptApp.deleteTrigger(t)); onEdit トリガーが動かない
🔎 原因: onEdit は simple trigger で外部API呼び出し不可、または installable trigger で権限不足
✅ 解決策: 外部API使うなら installable trigger として手動登録
💻 コード例:
// 手動インストール型トリガー作成
ScriptApp.newTrigger('myOnEdit')
.forSpreadsheet(SpreadsheetApp.getActive())
.onEdit()
.create(); 🧩 その他よくある
ネットワーク・データ処理・環境系
Exception: Request failed for https://... returned code 429
🔎 原因: 外部APIのレート制限(HTTP 429 Too Many Requests)
✅ 解決策: リトライ間隔を長くする、並列度を下げる、API側のQuota確認
💻 コード例:
// 429対策
UrlFetchApp.fetch(url, {
muteHttpExceptions: true
});
if (res.getResponseCode() === 429) {
Utilities.sleep(5000);
} SyntaxError: JSON.parse: unexpected character
🔎 原因: UrlFetchAppの戻り値がJSON形式でない(HTMLエラーページが返った等)
✅ 解決策: getContentText() の中身をconsole.logで確認、JSONかチェック
💻 コード例:
const res = UrlFetchApp.fetch(url);
console.log(res.getContentText().slice(0, 200)); // 先頭200文字確認 TypeError: Cannot redefine property
🔎 原因: Object.freeze されたオブジェクトのプロパティ書き換え
✅ 解決策: freezeを外す、またはスプレッド構文でコピーしてから変更
💻 コード例:
const frozen = Object.freeze({ a: 1 });
const copy = { ...frozen, a: 2 }; // スプレッドでコピー編集 日付がUTCでズレる
🔎 原因: Date オブジェクトは UTC基準、日本時間で扱う設定が抜けている
✅ 解決策: Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy-MM-dd') で明示指定
💻 コード例:
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd');
// 2026-04-22 のように日本時間で取れる 空文字 '' と null が混在して判定ミス
🔎 原因: getValue() は空セルで '' を返し、undefined/null との比較で想定外に
✅ 解決策: 厳密比較 === '' や、typeof チェックを明示
💻 コード例:
const v = sheet.getRange('A1').getValue();
if (v === '' || v === null || v === undefined) {
// 空セル処理
} 🛠 エラー対処の基本フロー
- エラーメッセージを正確に読む - 英語でも怖がらず、まず全文を確認
- エラーが出た行を特定 - GASエディタの赤線・実行ログの行番号を見る
- console.log で値を確認 - エラー直前の変数の中身を出力
- 本辞典で逆引き - 似たエラー文を Ctrl+F で探す
- 解決しなければ Google検索 - エラー文をそのままコピペ
- 最終手段: 公式ドキュメント - Apps Script Reference