トラブルシューティング

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

エラー メッセージ

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

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

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

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

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

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

Google Workspace ドメインの管理者は、ドメインで 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 で、オーナーがスクリプトを承認していることを確認します。
  • 他の認可モードでは、どちらのメソッドも呼び出さないでください。
  • Google Workspace インストール可能なトリガーでこの警告が新たに発生した場合は、トリガーが組織内のユーザーとして実行されていることを確認してください。

ライブラリがない

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

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

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

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

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

エラー 400: 拡張サービスで Google Chat API を呼び出す際に 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 エディタに組み込まれているより基本的なロガーとコンソール サービスです。

詳細については、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 の既知の問題のドキュメントをご覧ください。

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

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

ブレークポイントを追加する

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

ブレークポイントを追加する

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

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

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

スクリプトの実行方法を制御するには、デバッガ パネルの上部にある [ステップイン]、[ステップオーバー]、[ステップアウト] ボタンを使用します。これにより、スクリプトを一度に 1 行ずつ実行して、時間の経過に伴う値の変化を調べることができます。

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

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

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

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

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

困ったときは

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