トラブルシューティング

経験豊富なデベロッパーであっても、最初から正しいコードを記述することはほとんどありません。そのため、トラブルシューティングは開発プロセスの重要な部分となります。このセクションでは、スクリプトのエラーを検出して理解し、デバッグするのに役立つテクニックをいくつか紹介します。

エラー メッセージ

スクリプトでエラーが発生すると、エラー メッセージが表示されます。メッセージには、トラブルシューティングに使用される行番号が付いています。この方法で表示されるエラーには、構文エラーランタイム エラーの 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)

これらのエラーのトラブルシューティングが困難になる理由は、関数に渡すデータがコードに記述されていないことが多く、スプレッドシート、フォーム、その他の外部データソースから取得されるためです。以下のデバッグ手法を使用すると、これらのエラーの原因を特定できます。

一般的なエラー

一般的なエラーとその原因を以下に示します。

サービスが呼び出された回数が多すぎます: <action name>

このエラーは、特定のアクションの 1 日あたりの割り当てを超えたことを示します。たとえば、1 日に送信するメールが多すぎると、このエラーが発生することがあります。割り当ては、一般ユーザー向けアカウント、ドメイン向けアカウント、プレミアム アカウントで異なるレベルに設定されており、Google から事前の通知なく変更される場合があります。さまざまなアクションの割り当て上限については、Apps Script の割り当てに関するドキュメントをご覧ください。

サーバーが利用できません。またはサーバーエラーが発生しました。もう一度お試しください。

これらのエラーの原因として、次のようなことが考えられます。

  • Google のサーバーまたはシステムが一時的に利用できない。しばらく待ってから、スクリプトをもう一度実行してみてください。
  • スクリプトにエラーがあり、対応するエラー メッセージがない。スクリプトをデバッグして、問題を特定できるかどうかを確認します。
  • このエラーの原因となっているバグが Google Apps Script にあります。バグレポートの検索と提出の手順については、バグをご覧ください。新しいバグを報告する前に、他のユーザーがすでに報告していないか検索してください。

その操作を実行するには承認が必要です。

このエラーは、スクリプトに実行に必要な承認がないことを示します。スクリプトがスクリプト エディタで実行された場合、またはカスタム メニュー アイテムから実行された場合、ユーザーに承認ダイアログが表示されます。ただし、トリガーからスクリプトを実行する場合、Google Sites ページに埋め込む場合、またはサービスとして実行する場合は、ダイアログを表示できないため、このエラーが表示されます。

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

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

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

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

Access denied: DriveApp(アクセスが拒否されました: DriveApp)または The domain policy has disabled third-party Drive apps(ドメイン ポリシーによりサードパーティのドライブアプリが無効になっています)

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

ただし、ドライブ サービスを使用しているアドオンまたはウェブアプリがドメイン全体へのインストール用に公開され、ドメイン内の一部またはすべてのユーザーに対して管理者によってインストールされている場合、ドメインで Drive API が無効になっている場合でも、それらのユーザーに対してスクリプト関数が機能します。

スクリプトに、アクティブ ユーザーの ID を取得する権限がありません。

アクティブなユーザーの ID とメールアドレスがスクリプトで使用できないことを示します。この警告は、Session.getActiveUser() の呼び出しが原因で発生します。また、スクリプトが AuthMode.FULL 以外の認可モードで実行されている場合、Session.getEffectiveUser() の呼び出しによっても発生する可能性があります。この警告が通知されると、その後の User.getEmail() の呼び出しでは「""」のみが返されます。

この警告のトラブルシューティングを行う方法はいくつかあります。スクリプトが実行されている認可モードによって異なります。認可モードは、トリガーされた関数で、e イベント パラメータauthMode プロパティとして公開されます。

  • AuthMode.FULL では、代わりに Session.getEffectiveUser() の使用を検討してください。
  • AuthMode.LIMITED で、所有者がスクリプトを承認していることを確認します。
  • 他の認可モードでは、どちらのメソッドも呼び出さないでください。
  • インストール可能なトリガーからこの警告が新たに表示される場合は、トリガーが組織内のユーザーとして実行されていることを確認してください。

ライブラリがない

一般的なライブラリをスクリプトに追加しても、ライブラリがスクリプトの依存関係としてリストされていても、ライブラリが見つからないというエラー メッセージが表示されることがあります。ライブラリに同時にアクセスしているユーザーが多すぎることが原因である可能性があります。このエラーを回避するには、次のいずれかの方法を試してください。

  • ライブラリのコードをスクリプトにコピーして貼り付け、ライブラリの依存関係を削除します。
  • ライブラリ スクリプトをコピーし、アカウントからライブラリとしてデプロイします。元のスクリプトの依存関係を、公開ライブラリではなく新しいライブラリに更新してください。

ライブラリ バージョンまたはデプロイ バージョンがないためエラーが発生しました。エラーコード Not_Found

このエラー メッセージは、次のいずれかを示しています。

  • デプロイされたスクリプトのバージョンが削除されました。デプロイされたスクリプトのバージョンを更新するには、バージョニングされたデプロイメントを編集するをご覧ください。
  • スクリプトで使用しているライブラリのバージョンが削除されています。不足しているライブラリを確認するには、ライブラリ名の横にある [その他] > [新しいタブで開く] をクリックします。ライブラリが不足している場合は、エラー メッセージが表示されます。更新が必要なライブラリを見つけたら、次のいずれかの操作を行います。
  • スクリプトで使用しているライブラリのスクリプトに、削除されたバージョンを使用する別のライブラリが含まれています。次のいずれかを行います。
    • スクリプトで使用するライブラリへの編集アクセス権がある場合は、そのスクリプトのセカンダリ ライブラリを既存のバージョンに更新します。
    • 別のバージョンを使用するようにライブラリを更新します。ライブラリを更新するをご覧ください。
    • スクリプト プロジェクトとコードからライブラリを削除します。ライブラリを削除するをご覧ください。

拡張サービスで Google Chat API を呼び出すとエラー 400: invalid_scope が発生する

エラー メッセージ Some requested scopes cannot be shown とともに Error 400: invalid_scope が表示された場合は、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 つの方法があります。Cloud ロギング サービスと、Apps Script エディタに組み込まれているより基本的なLogger サービスとコンソール サービスです。

詳細については、Logging ガイドをご覧ください。

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 アカウントに関する問題

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

  • 複数のアカウントにログインしている状態でApps Script エディタを開いた場合、続行するアカウントを選択するよう求められます。

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

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

困ったときは

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