本サイトはアフィリエイト広告(A8.net/もしもアフィリエイト/アクセストレード等)を利用しています

🩹 Cheat Sheet

GASエラー逆引き辞典

Google Apps Scriptでよく出るエラー25項目を、原因・解決コード・詳細記事リンクと合わせて逆引きできる辞典ページ。 本ページをブックマークしておけば、次のエラー遭遇時に検索時間ゼロで解決できます。

25エラー項目
6カテゴリ
100%解決コード付き

🔍 エラーを探すコツ: ブラウザで 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) {
  // 空セル処理
}

🛠 エラー対処の基本フロー

  1. エラーメッセージを正確に読む - 英語でも怖がらず、まず全文を確認
  2. エラーが出た行を特定 - GASエディタの赤線・実行ログの行番号を見る
  3. console.log で値を確認 - エラー直前の変数の中身を出力
  4. 本辞典で逆引き - 似たエラー文を Ctrl+F で探す
  5. 解決しなければ Google検索 - エラー文をそのままコピペ
  6. 最終手段: 公式ドキュメント - Apps Script Reference

📚 あわせて読みたい