トラブルシューティング

経験豊富なデベロッパーでも、最初の試行でコードを正しく記述することはめったにないため、トラブルシューティングは開発プロセスの重要な部分となります。このセクションでは、スクリプトのエラーの検出、把握、デバッグに役立つ手法について説明します。

エラー メッセージ

スクリプトにエラーが発生すると、エラー メッセージが表示されます。メッセージには、トラブルシューティングに使用する行番号が付属しています。その場合に表示されるエラーには、構文エラーとランタイム エラーの 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 サイトのページに埋め込まれたスクリプト、サービスとして実行した場合は、ダイアログが表示されず、このエラーが表示されます。

スクリプトを承認するには、スクリプト エディタを開いて関数を実行します。承認プロンプトが表示され、スクリプト プロジェクトを承認できます。スクリプトに未承認の新しいサービスが含まれている場合は、スクリプトを再承認する必要があります。

このエラーは、ユーザーが承認する前に起動したトリガーが原因で頻繁に発生します。スクリプト プロジェクトへのアクセス権がない場合(たとえば、使用しているアドオンでエラーが発生している場合)、通常はアドオンを再度使用してスクリプトを承認できます。トリガーが引き続き配信され、このエラーが表示される場合は、次の手順でトリガーを削除できます。

  1. Apps Script プロジェクトの左側にあるトリガーアイコン をクリックします。
  2. 削除するトリガーの右側で、その他アイコン > [トリガーを削除] をクリックします。

アドオンをアンインストールして、問題のあるアドオン トリガーを削除することもできます。

アクセスが拒否されました: DriveApp または ドメイン ポリシーによってサードパーティのドライブアプリが無効になっています

Google Workspace ドメインの管理者は、自身のドメインの Drive API を無効にできます。無効にすると、ユーザーは Google ドライブ アプリをインストールして使用できなくなります。また、管理者が Drive API を無効にする前にスクリプトが承認されていた場合でも、ユーザーはドライブ サービスまたは高度なドライブ サービスを使用する Apps Script アドオンを使用できなくなります。

ただし、ドライブ サービスを使用するアドオンまたはウェブアプリがドメイン全体のインストール用に公開され、管理者がドメイン内の一部またはすべてのユーザーのためにインストールしている場合は、ドメインで Drive 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 を呼び出す場合の Error 400: invalid_scope

Error 400: invalid_scope がエラー メッセージ Some requested scopes cannot be shown とともに表示された場合は、Apps Script プロジェクトの appsscript.json ファイルで認証スコープが指定されていないことを意味します。ほとんどの場合、Apps Script はスクリプトに必要なスコープを自動的に決定しますが、Chat の高度なサービスを使用する場合は、スクリプトで使用する承認スコープを Apps Script プロジェクトのマニフェスト ファイルに手動で追加する必要があります。明示的なスコープの設定をご覧ください。

このエラーを解決するには、Apps Script プロジェクトの appsscript.json ファイルに、oauthScopes 配列の一部として適切な認証スコープを追加します。たとえば、spaces.messages.create メソッドを呼び出すには、以下を追加します。

"oauthScopes": [
  "https://www.googleapis.com/auth/chat.messages.create"
]

デバッグ

誤りがあるからといって、必ずしもエラー メッセージが表示されるわけではありません。コードが技術的に正しく、実行できるにもかかわらず、結果が期待どおりではない場合、より細かいエラーが発生する可能性があります。ここでは、このような状況に対処するための戦略と、スクリプトが期待どおりに実行されない場合にさらに調査する方法について説明します。

ロギング

デバッグの際には、多くの場合、スクリプト プロジェクトの実行時に情報を記録することをおすすめします。Google Apps Script には、情報をロギングするための 2 つの方法が用意されています。1 つは Cloud Logging サービスです。もう 1 つは、Apps Script エディタに組み込まれている基本的なロガーサービスとコンソール サービスです。

詳しくは、ロギングガイドをご覧ください。

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 の既知の問題のドキュメントをご覧ください。

デバッガとブレークポイントを使用する

スクリプトの問題を特定するには、スクリプトをデバッグモードで実行します。デバッグモードでスクリプトを実行すると、スクリプトがブレークポイント(問題があると思われる行をハイライト表示した行)に到達すると、一時停止します。スクリプトが一時停止すると、その時点での各変数の値が表示されるため、大量のロギング ステートメントを追加することなく、スクリプトの内部動作を検査できます。

ブレークポイントを追加

ブレークポイントを追加するには、ブレークポイントを追加する行の行番号にカーソルを合わせます。行番号の左側にある円をクリックします。以下の画像は、スクリプトに追加されたブレークポイントの例を示しています。

ブレークポイントを追加

デバッグモードでスクリプトを実行する

スクリプトをデバッグモードで実行するには、エディタの上部にある [Debug] をクリックします。

スクリプトは、ブレークポイントがある行を実行する前に一時停止し、デバッグ情報の表を表示します。このテーブルを使用して、パラメータの値やオブジェクトに格納されている情報などのデータを検査できます。

スクリプトの実行方法を制御するには、[Debugger] パネルの上部で、[ステップイン]、[ステップオーバー]、[ステップアウト] の各ボタンを使用します。これにより、スクリプトを 1 行ずつ実行し、値の推移を検査できます。

複数の Google アカウントに関する問題

同時に複数の Google アカウントにログインすると、アドオンやウェブアプリにアクセスできないことがあります。マルチログインや、複数の Google アカウントへの同時ログインは、Apps Script、アドオン、ウェブアプリではサポートされていません。

  • 複数のアカウントにログインしている状態で Apps Script エディタを開いた場合は、使用するアカウントの選択を求めるプロンプトが表示されます。

  • ウェブアプリまたはアドオンを開いたときにマルチログインの問題が発生した場合は、次のいずれかの解決策をお試しください。

    • すべての Google アカウントからログアウトし、アクセスしたいアドオンまたはウェブアプリを使用しているアカウントにのみログインします。
    • Google Chrome のシークレット ウィンドウまたは同等のシークレット ブラウジング ウィンドウを開き、アクセスするアドオンまたはウェブアプリが含まれている Google アカウントにログインします。

参考情報

上記のツールと手法を使用して問題をデバッグすると、さまざまな問題を解決できますが、解決に特別なサポートが必要な問題が発生する場合もあります。質問やバグの報告方法については、サポートページをご覧ください。