経験豊富なデベロッパーでも、コードを最初に正しく記述することはめったにありません。そのため、トラブルシューティングは開発プロセスの重要な部分となります。このセクションでは、スクリプトのエラーを見つけて理解し、デバッグするのに役立つ手法について説明します。
エラー メッセージ
スクリプトでエラーが発生すると、エラー メッセージが表示されます。メッセージには、トラブルシューティングに使用される行番号が添えられています。このように表示されるエラーには、構文エラーとランタイム エラーの 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);
}
コードの形式は正しいのですが、MailApp.sendEmail
を呼び出すときにメールアドレスに「john」という値を渡しています。これは有効なメールアドレスではないため、スクリプトを実行すると次のエラーがスローされます。
無効なメールアドレス: john(5 行目)
これらのエラーのトラブルシューティングが難しいのは、関数に渡すデータがコードに記述されておらず、スプレッドシート、フォーム、その他の外部データソースから取得されることが多いためです。以下のデバッグ手法を使用すると、これらのエラーの原因を特定できます。
一般的なエラー
以下に、一般的なエラーとその原因の一覧を示します。
サービスが呼び出された回数が多すぎます: <アクション名>
このエラーは、特定のアクションの 1 日の割り当てを超えたことを示します。たとえば、1 日に送信するメールが多すぎると、このエラーが発生することがあります。割り当ては、一般ユーザー向けアカウント、ドメイン アカウント、プレミア アカウントで異なるレベルに設定されており、Google からの事前告知なしにいつでも変更される可能性があります。さまざまなアクションの割り当て上限については、Apps Script の割り当てに関するドキュメントをご覧ください。
サーバーにアクセスできません。またはサーバー エラーが発生しました。もう一度お試しください。
これらのエラーには、次のような原因が考えられます。
- Google のサーバーまたはシステムが一時的に利用できない。しばらく待ってから、スクリプトをもう一度実行してみてください。
- スクリプトにエラーがありますが、対応するエラー メッセージがありません。スクリプトをデバッグして、問題を特定できるかどうかを確認します。
- このエラーは、Google Apps Script のバグが原因で発生しています。バグレポートの検索と提出の手順については、バグをご覧ください。新しいバグを報告する前に、他のユーザーがすでに報告していないか検索してください。
その操作を実行するには承認が必要です。
このエラーは、スクリプトの実行に必要な承認がないことを示します。スクリプト エディタまたはカスタム メニュー項目からスクリプトを実行すると、ユーザーに承認ダイアログが表示されます。ただし、スクリプトがトリガーから実行された場合、Google サイトのページに埋め込まれた場合、またはサービスとして実行された場合は、ダイアログを表示できず、このエラーが表示されます。
スクリプトを承認するには、スクリプト エディタを開いて任意の関数を実行します。承認プロンプトが表示されるので、スクリプト プロジェクトを承認します。スクリプトに新しい未承認のサービスが含まれている場合は、スクリプトを再承認する必要があります。
このエラーは、ユーザーがトリガーを承認する前にトリガーが起動しているか、トリガーの承認が期限切れになっていることが原因で発生することがよくあります。スクリプト プロジェクトにアクセスできない場合(使用しているアドオンでエラーが発生している場合など)は、通常、アドオンを再度使用することでスクリプトを承認できます。トリガーが引き続き起動してこのエラーが発生する場合は、次の手順でトリガーを削除できます。
- Apps Script プロジェクトの左側にある [トリガー] をクリックします。
- 削除するトリガーの右側にあるその他アイコン > [トリガーを削除] をクリックします。
問題のあるアドオン トリガーは、アドオンをアンインストールすることでも削除できます。
きめ細かい権限が原因でこれらのエラーが発生することもあります。実行がトリガーによって呼び出されない限り、Apps Script は不足している権限をユーザーに自動的にリクエストします。このエラーからトリガー実行を保護するには、認可スコープのページをご覧ください。
アクセスが拒否されました: DriveApp または ドメイン ポリシーによりサードパーティのドライブアプリが無効になっています
Google Workspace ドメインの管理者は、ドメインの Drive API を無効にすることができます。これにより、ユーザーは Google ドライブ アプリをインストールして使用できなくなります。この設定により、ユーザーは Drive サービスまたは Advanced Drive Service を使用する Apps Script アドオンを使用できなくなります(管理者が Drive API を無効にする前にスクリプトが承認されていた場合でも同様です)。
ただし、ドライブ サービスを使用するアドオンまたはウェブアプリがドメイン全体のインストール用に公開され、ドメイン内の一部またはすべてのユーザーに対して管理者がインストールした場合、ドメインでドライブ API が無効になっていても、それらのユーザーのスクリプト関数は機能します。
スクリプトにアクティブ ユーザーの ID を取得する権限がありません。
アクティブ ユーザーの ID とメールアドレスがスクリプトで使用できないことを示します。この警告は、Session.getActiveUser()
の呼び出しの結果です。スクリプトが AuthMode.FULL
以外の承認モードで実行されている場合、Session.getEffectiveUser()
の呼び出しによって発生することもあります。この警告がシグナルで送信されると、以降の User.getEmail()
の呼び出しでは "" のみが返されます。
この警告のトラブルシューティングを行う方法はいくつかあり、スクリプトが実行されている承認モードによって異なります。承認モードは、トリガー関数で e
イベント パラメータの 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 管理者は、管理コンソールで許可リストを有効にして、Apps Script を介してアクセスできる外部ドメインを制御できます。
このエラーを解決するには、管理者に連絡して、URL を許可リストに追加するよう依頼してください。
デバッグ
すべての間違いでエラー メッセージが表示されるわけではありません。コードは技術的には正しく実行できるものの、結果が期待どおりにならないという、より微妙なエラーが発生している可能性があります。このような状況に対処し、期待どおりに実行されないスクリプトをさらに調査するための戦略をいくつかご紹介します。
ロギング
デバッグの際は、スクリプト プロジェクトの実行時に情報を記録すると役立つことがよくあります。Google Apps Script には、情報をロギングする 2 つの方法があります。1 つは Cloud ロギング サービスで、もう 1 つは Apps Script エディタに組み込まれているより基本的な Logger サービスとコンソール サービスです。
詳細については、ロギング ガイドをご覧ください。
Error Reporting
ランタイム エラーによって発生した例外は、Google Cloud Error Reporting サービスを使用して自動的に記録されます。このサービスを使用すると、スクリプト プロジェクトで作成された例外メッセージを検索してフィルタできます。
Error Reporting にアクセスするには、Google Cloud Platform コンソールで Cloud ログとエラー レポートを表示するをご覧ください。
実行数
スクリプトを実行するたびに、Apps Script は Cloud ログを含む実行の記録を作成します。これらのレコードは、スクリプトが実行したアクションを把握するのに役立ちます。
Apps Script プロジェクトでスクリプトの実行を表示するには、左側の [実行数]
をクリックします。Apps Script サービスのステータスを確認する
まれに、特定の Google Workspace サービス(Gmail やドライブなど)で一時的な問題が発生し、サービス停止につながることがあります。この場合、これらのサービスとやり取りする Apps Script プロジェクトが想定どおりに機能しないことがあります。
Google Workspace サービスの停止が発生しているかどうかは、Google Workspace ステータス ダッシュボードで確認できます。現在サービス停止が発生している場合は、解決されるまで待つか、Google Workspace ヘルプセンターまたは Google Workspace に関して報告されている問題のドキュメントで追加のサポートを求めることができます。
デバッガとブレークポイントを使用する
スクリプトの問題を特定するには、デバッグモードで実行します。デバッグモードで実行すると、スクリプト内の問題があると思われる行をハイライト表示したブレークポイントに達したときに、スクリプトが一時停止します。スクリプトが一時停止すると、その時点の各変数の値が表示されるため、多くのロギング ステートメントを追加しなくても、スクリプトの内部動作を検査できます。
ブレークポイントを追加する
ブレークポイントを追加するには、ブレークポイントを追加する行の行番号にカーソルを合わせます。行番号の左側にある円をクリックします。次の画像は、スクリプトに追加されたブレークポイントの例を示しています。
デバッグモードでスクリプトを実行する
デバッグモードでスクリプトを実行するには、エディタの上部にある [デバッグ] をクリックします。
スクリプトがブレークポイントを含む行を実行する前に、スクリプトは一時停止し、デバッグ情報の表を表示します。この表を使用して、パラメータの値やオブジェクトに保存されている情報などのデータを検査できます。
スクリプトの実行方法を制御するには、デバッガ パネルの上部にある [ステップイン]、[ステップオーバー]、[ステップアウト] ボタンを使用します。これにより、スクリプトを 1 行ずつ実行し、値の推移を調べることができます。
エラー: 現在の行のソースコードはありません
このエラーは、アクティブなデバッグ ファイルが利用できない場合に表示されます。Google Apps Script では、eval()
や new Function()
を使用して生成された JavaScript(JS)スクリプトなど、動的に生成された JavaScript(JS)スクリプトをスクリプト エディタに表示することはできません。これらのスクリプトは V8 エンジン内で作成および実行されますが、エディタではスタンドアロン ファイルとして表示されません。これらのスクリプトをステップインすると、このエラーが発生します。
たとえば、次のコードについて考えてみます。
function myFunction() {
eval('a=2');
}
eval()
が呼び出されると、その引数は JS コードとして扱われ、V8 エンジン内で動的に作成されたスクリプトとして実行されます。eval()
にステップインすると、このエラーが表示されます。スクリプトに //# sourceURL
コメントが含まれている場合、その名前がコールスタックに表示されます。それ以外の場合は、名前のないエントリとして表示されます。
エラー メッセージが表示されても、デバッグ セッションはアクティブなままで、実行を続行できます。続行するには、ステップイン、ステップアウト、または実行の再開に進みます。ただし、実行が動的スクリプトのスコープ内にある限り、このエラーは引き続き表示されます。実行が動的スクリプトから移動すると、このエラーなしでデバッグが続行されます。
複数の Google アカウントに関する問題
複数の Google アカウントに同時にログインしている場合、アドオンやウェブアプリにアクセスできないことがあります。マルチログイン(同時に複数の Google アカウントにログインしている状態のこと)は、Apps Script、アドオン、ウェブアプリではサポートされていません。
複数のアカウントにログインしている状態で Apps Script エディタを開くと、続行するアカウントを選択するよう求めるメッセージが表示されます。
ウェブアプリまたはアドオンを開いたときにマルチログインに関する問題が発生した場合は、次のいずれかの解決方法をお試しください。
- すべての Google アカウントからログアウトし、アクセスするアドオンまたはウェブアプリを含むアカウントにのみログインします。
- Google Chrome のシークレット ウィンドウ、または同等のシークレット ブラウジング ウィンドウを開き、アクセスするアドオンまたはウェブアプリを含む Google アカウントにログインします。
困ったときは
上記のツールと手法を使用して問題をデバッグすると、さまざまな問題を解決できますが、解決に特別なサポートが必要になる問題が発生する可能性もあります。質問やバグの報告については、サポートページをご覧ください。