経験豊富なデベロッパーでも、コードを最初に正しく記述することはめったにありません。そのため、トラブルシューティングは開発プロセスの重要な部分となります。このセクションでは、スクリプトのエラーを見つけて理解し、デバッグする手法について説明します。
エラー メッセージ
スクリプトでエラーが発生すると、行番号とともにエラー メッセージが表示されます。エラーには、構文エラーとランタイム エラーの 2 つの基本的なタイプがあります。
構文エラー
構文エラーは、コードが JavaScript の文法に従っていない場合に発生し、スクリプトを保存するときに検出されます。たとえば、次のスニペットには構文エラーが含まれています。
function emailDataRow(rowNumber) {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var rowData = data[rowNumber-1].join(" ";
MailApp.sendEmail('john@example.com',
'Data in row ' + rowNumber,
rowData);
}
問題は、4 行目の末尾に ) 文字がないことです。スクリプトを保存すると、次のエラーが表示されます。
引数リストの後に ) がありません。(4 行目)
これらのエラーはすぐに検出されるため、トラブルシューティングが簡単です。有効なコードのみがプロジェクトに保存されます。
ランタイム エラー
ランタイム エラーは、関数またはクラスが正しく使用されていない場合に発生し、スクリプトの実行時に検出されます。たとえば、次のコードは実行時エラーを引き起こします。
function emailDataRow(rowNumber) {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var rowData = data[rowNumber-1].join(" ");
MailApp.sendEmail('john',
'Data in row ' + rowNumber,
rowData);
}
コードの形式は正しいですが、「john」は無効なメールアドレスです。次のエラーがスローされます。
無効なメールアドレス: john(5 行目)
このようなエラーは、データがスプレッドシートやフォームなどの外部ソースから取得されることが多いため、解決が困難です。デバッグ手法を使用して原因を特定します。
一般的なエラー
一般的なエラーとその原因を以下に示します。
サービスが呼び出された回数が多すぎます: <アクション名>
このエラーは、メールの送信数が多すぎるなど、アクションの 1 日の割り当て量を超えたことを示します。割り当てはアカウントの種類によって異なり、変更されることがあります。Apps Script の割り当てに関するドキュメントで上限を確認する。
サーバーにアクセスできません。またはサーバー エラーが発生しました。もう一度お試しください。
考えられる原因としては、次のものあげられます。
- Google サーバーが一時的に利用できない。しばらくしてからもう一度お試しください。
- スクリプトのエラーに対応するメッセージがありません。デバッグして問題を特定してみてください。
- Google Apps Script にバグが存在します。Bugs でバグレポートを検索して提出します。
その操作を実行するには承認が必要です。
スクリプトには実行に必要な認証がありません。トリガーから、またはサービスとしてスクリプトを実行する場合、承認ダイアログを表示することはできません。
スクリプトを承認するには、スクリプト エディタを開いて任意の関数を実行します。スクリプトで新しい未承認のサービスを使用している場合は、再承認する必要があります。
承認前または有効期限後に配信されるトリガーが原因で、このエラーが発生することがよくあります。アドオンが原因の場合は、アドオンを再度使用して再認証します。問題のあるトリガーを削除します。
- Apps Script プロジェクトで、[トリガー] をクリックします。
- トリガーの横にある [その他] > [トリガーを削除] をクリックします。
または、アドオンをアンインストールします。
きめ細かい権限も、これらのエラーの原因になる可能性があります。トリガー実行を保護するには、認可スコープのページをご覧ください。
アクセスが拒否されました: DriveApp または ドメイン ポリシーによりサードパーティのドライブアプリが無効になっています
Google Workspace 管理者は、ドメインの Drive API を無効にできます。これにより、ユーザーは Drive サービスを使用するドライブアプリや Apps Script アドオンを使用できなくなります。
アドオンまたはウェブアプリがドメイン全体のインストール用に公開され、管理者がインストールした場合、Drive API が無効になっていてもスクリプトは機能します。
スクリプトにアクティブ ユーザーの ID を取得する権限がありません。
アクティブ ユーザーの ID とメールアドレスを利用できません。これは、AuthMode.FULL 以外の認証モードで Session.getActiveUser() または Session.getEffectiveUser() を呼び出した結果です。スクリプトがトリガーで実行される場合は、Apps Script イベント オブジェクトの authMode プロパティで承認モードを確認できます。
承認モードに基づいて、この問題をトラブルシューティングします。
AuthMode.FULLでは、代わりにSession.getEffectiveUser()の使用を検討してください。AuthMode.LIMITEDで、オーナーがスクリプトを承認していることを確認します。- 他の認可モードでは、どちらのメソッドも呼び出さないでください。
- Google Workspace をご利用のお客様で、インストール可能なトリガーからこの警告が新たに表示されるようになった場合は、トリガーが組織内のユーザーとして実行されていることを確認してください。
ライブラリがありません
ライブラリに同時にアクセスするユーザーが多すぎると、ライブラリが見つからないと報告されることがあります。この問題を解決するには:
- ライブラリのコードをスクリプトに直接コピーします。
- ご自身のアカウントからライブラリをコピーしてデプロイします。
- スクリプトの機能にライブラリが必要ない場合は、スクリプト プロジェクトからライブラリを削除します。
ライブラリ バージョンまたはデプロイ バージョンがないためエラーが発生しました。エラーコード Not_Found
このエラー メッセージは、次のいずれかを示しています。
- デプロイで使用されているスクリプト バージョンが削除されました。この問題を解決するには、デプロイを編集して別のスクリプト バージョンを選択します。
- スクリプトで使用されているライブラリのバージョンが削除されました。この問題を解決するには、スクリプト エディタの [ライブラリ] でライブラリを見つけて、別のバージョンに更新するか、ライブラリを削除します。更新するには、バージョン番号をクリックして別のバージョンを選択します。削除するには、その他アイコン > [削除] をクリックします。
- ライブラリに別のライブラリが含まれており、そのライブラリのバージョンが削除された。この問題を解決するには、ライブラリの作成者に連絡するか、スクリプトで使用するライブラリの別のバージョンを使用してください。
高度なサービスで Google Chat API を呼び出すとエラー 400(invalid_scope)が発生する
Error 400: invalid_scope エラーと Some requested scopes cannot be shown エラー メッセージが表示された場合は、Apps Script プロジェクトの appsscript.json ファイルで承認スコープが指定されていません。ほとんどの場合、Apps Script はスクリプトに必要なスコープを自動的に判断しますが、Chat の高度なサービスを使用する場合は、スクリプトで使用する承認スコープを Apps Script プロジェクトのマニフェスト ファイルに手動で追加する必要があります。明示的なスコープの設定をご覧ください。
このエラーを解決するには、oauthScopes 配列の一部として、適切な認証スコープを Apps Script プロジェクトの appsscript.json ファイルに追加します。たとえば、spaces.messages.create メソッドを呼び出すには、次のように追加します。
"oauthScopes": [
"https://www.googleapis.com/auth/chat.messages.create"
]
<URL> に対して UrlFetch の呼び出しを行うことは、管理者により許可されていません
Google Workspace 管理者は、許可リストを使用して外部ドメインへのアクセスを制御できます。URL を許可リストに追加するには、管理者にお問い合わせください。
権限に関するポリシー違反
このエラーは、HTMLService を使用するアプリケーションが、カメラやマイクへのアクセスに必要な navigator.mediaDevices.getUserMedia() などの機密性の高い権限を必要とする Web API を実行しようとしたときに発生します。Apps Script のサンドボックス環境では、ユーザーのセキュリティを保護するためにこれらの機能が制限されています。
これらの権限を必要とする機能を別のドメイン(Apps Script の外部)でホストし、新しいウィンドウまたはタブで開きます。キャプチャしたデータやレスポンスは、この例のように Apps Script アプリケーションに投稿できます。
コード.gs
function doGet(e) { return HtmlService.createHtmlOutputFromFile('Index') .setTitle('Media Devices Example'); } function processCameraData(data) { Logger.log('Received data from client-side: ' + data); // Process data as needed }
Index.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<button id="open-camera">Open Camera in New Window</button>
<script>
document.getElementById('open-camera').addEventListener('click', function() {
// URL for external domain handling camera access & posting data back.
// External page uses getUserMedia & window.opener.postMessage(...).
var externalUrl = 'https://your-external-domain.com/camera';
window.open(externalUrl, 'cameraWindow', 'width=600,height=400');
});
// Listen for messages from the external window.
window.addEventListener('message', function(event) {
// Check event.origin to ensure message is from the expected source.
if (event.origin !== 'https://your-external-domain.com') {
return;
}
console.log('Data received from external window:', event.data);
// Send data to server-side Apps Script.
google.script.run.processCameraData(event.data);
});
</script>
</body>
</html>デバッグ
エラーの中には、メッセージをトリガーしない微妙なものもあります。たとえば、コードは実行できても、結果が予期しないものになることがあります。次の戦略を使用して、予期しない動作をするスクリプトを調査します。
ロギング
スクリプト エディタの Cloud ロギング サービスまたはロガーとコンソール サービスを使用して、スクリプトの実行時に情報を記録します。
Error Reporting
Google Cloud で Error Reporting を使用するには、デフォルト プロジェクトではなく、標準のユーザー管理プロジェクトを使用します。
標準プロジェクトを使用すると、ランタイム エラーが Google Cloud Error Reporting に自動的に記録されます。Google Cloud コンソールで Cloud ログとエラー レポートを表示する。
実行
Google Apps Script は、Cloud ログを含むすべての実行を記録します。実行を表示するには、[実行] をクリックします。
サービスのステータスを確認する
Google Workspace ステータス ダッシュボードで、Google Workspace サービスの停止がないか確認します。
デバッガとブレークポイントを使用する
スクリプトの問題を特定するには、デバッグモードで実行します。デバッグモードで実行すると、スクリプトはブレークポイントに達したときに一時停止します。ブレークポイントとは、問題があると思われるスクリプト内の行をハイライト表示したものです。スクリプトが一時停止すると、その時点の各変数の値が表示されるため、多くのロギング ステートメントを追加しなくても、スクリプトの内部動作を検査できます。
ブレークポイントを追加する
ブレークポイントを追加するには、ブレークポイントを追加する行の行番号にカーソルを合わせます。行番号の左側にある円をクリックします。次の画像は、スクリプトに追加されたブレークポイントの例を示しています。

デバッグモードでスクリプトを実行する
デバッグモードでスクリプトを実行するには、エディタの上部にある [デバッグ] をクリックします。
スクリプトがブレークポイントを含む行を実行する前に、スクリプトは一時停止し、デバッグ情報の表を表示します。この表を使用して、パラメータの値やオブジェクトに保存されている情報などのデータを検査できます。
スクリプトの実行方法を制御するには、デバッガ パネルの上部にある [ステップイン]、[ステップオーバー]、[ステップアウト] の各ボタンを使用します。これにより、スクリプトを 1 行ずつ実行し、値が時間の経過とともにどのように変化するかを調べることができます。
エラー: 現在の行のソースコードはありません

このエラーは、アクティブなデバッグ ファイルが利用できない場合に表示されます。Google Apps Script では、eval() や new Function() を使用して生成されたスクリプトなど、動的に生成された JavaScript(JS)スクリプトをスクリプト エディタに表示することはできません。これらのスクリプトは V8 エンジン内で作成および実行されますが、エディタではスタンドアロン ファイルとして表示されません。これらのスクリプトにステップインすると、このエラーが発生します。
たとえば、次のコードについて考えてみます。
function myFunction() {
eval('a=2');
}
eval() が呼び出されると、その引数は JS コードとして扱われ、V8 エンジン内で動的に作成されたスクリプトとして実行されます。eval() にステップインすると、このエラーが表示されます。スクリプトに //# sourceURL コメントが含まれている場合、その名前がコールスタックに表示されます。それ以外の場合は、名前のないエントリとして表示されます。
エラー メッセージが表示されても、デバッグ セッションはアクティブなままで、実行を続行できます。続行するには、ステップイン、ステップアウト、または実行の再開に進みます。ただし、実行が動的スクリプトの範囲内にある限り、このエラーは引き続き表示されます。実行が動的スクリプトから移動すると、このエラーなしでデバッグが続行されます。
複数の Google アカウントに関する問題
複数の Google アカウントに同時にログインしている場合、アドオンやウェブアプリにアクセスできないことがあります。マルチログイン(同時に複数の Google アカウントにログインしている状態のこと)は、Apps Script、アドオン、ウェブアプリではサポートされていません。
複数のアカウントにログインしている状態で Apps Script エディタを開くと、続行するアカウントを選択するよう求めるメッセージが表示されます。
ウェブアプリまたはアドオンを開いたときにマルチログインに関する問題が発生した場合は、次のいずれかの解決方法をお試しください。
- すべての Google アカウントからログアウトし、アクセスするアドオンまたはウェブアプリを含むアカウントにのみログインします。
- Google Chrome のシークレット ウィンドウ、または同等のシークレット ブラウジング ウィンドウを開き、アクセスするアドオンまたはウェブアプリを含む Google アカウントにログインします。
困ったときは
サポートページにアクセスして、質問をしたり、バグを報告したりしてください。