経験豊富なデベロッパーでさえ、一度でコードを正しく記述することはほとんどないため、トラブルシューティングは開発プロセスの重要な部分です。このセクションでは、スクリプト内のエラーの検出、把握、デバッグに役立つ手法について説明します。
エラー メッセージ
スクリプトでエラーが発生すると、エラー メッセージが表示されます。メッセージには、トラブルシューティングに使用する行番号が伴います。この方法で表示されるエラーには、構文エラーとランタイム エラーの 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 プロジェクトの左側にある [トリガー] をクリックします。
- 削除するトリガーの右側にあるその他アイコン > [トリガーを削除] をクリックします。
アドオンをアンインストールして、問題のあるアドオン トリガーを削除することもできます。
アクセスが拒否されました: ドライブアプリまたはドメイン ポリシーにより、サードパーティのドライブ用アプリが無効になっています
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 インストール可能なトリガーでこの警告が新たに発生した場合は、トリガーが組織内のユーザーとして実行されていることを確認してください。
ライブラリがない
一般的な library をスクリプトに追加すると、ライブラリがスクリプトの依存関係として一覧表示されていても、見つからないというエラー メッセージが表示されることがあります。理由としては、ライブラリに同時にアクセスしているユーザーが多すぎることが考えられます。このエラーを回避するには、次のいずれかの解決策を試してください。
- ライブラリのコードをコピーしてスクリプトに貼り付け、ライブラリの依存関係を削除します。
- ライブラリ スクリプトをコピーして、アカウントからライブラリとしてデプロイします。元のスクリプトの依存関係を、公開ライブラリではなく新しいライブラリに更新してください。
ライブラリ バージョンまたはデプロイ バージョンがないためエラーが発生しました。エラーコード Not_Found
このエラー メッセージは、次のいずれかを示しています。
- デプロイされたスクリプトのバージョンが削除されました。デプロイされたスクリプトのバージョンを更新するには、バージョニングされたデプロイを編集するをご覧ください。
- スクリプトが使用するライブラリのバージョンが削除されている。欠落しているライブラリを確認するには、ライブラリ名の横にある > [新しいタブで開く] をクリックします。ライブラリが見つからないと、エラー メッセージが表示されます。更新が必要なライブラリが見つかったら、次のいずれかを行います。
- 別のバージョンを使用するようにライブラリを更新してください。ライブラリを更新するをご覧ください。
- 削除したライブラリをスクリプトのプロジェクトとコードから削除します。ライブラリを削除するをご覧ください。
[その他] - スクリプトが使用するライブラリのスクリプトに、削除されたバージョンを使用する別のライブラリが含まれている。次のいずれかの操作を行います。
- スクリプトが使用するライブラリに対する編集権限がある場合は、そのスクリプトのセカンダリ ライブラリを既存のバージョンに更新します。
- 別のバージョンを使用するようにライブラリを更新してください。ライブラリを更新するをご覧ください。
- スクリプト プロジェクトとコードからライブラリを削除します。ライブラリを削除するをご覧ください。
拡張サービスで Google Chat API を呼び出す場合の Error 400: invalid_scope
エラー メッセージ Some requested scopes cannot be shown
とともに Error 400: invalid_scope
が表示された場合は、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 には、Cloud Logging サービスと、Apps Script エディタに組み込まれている基本的なロガー / コンソール サービスの 2 つの方法で情報をログに記録できます。
詳しくは、ロギングガイドをご覧ください。
Error Reporting
ランタイム エラーが原因で発生した例外は、Google Cloud Error Reporting サービスを使用して自動的に記録されます。このサービスを使用すると、スクリプト プロジェクトが作成する例外メッセージを検索およびフィルタできます。
Error Reporting にアクセスするには、Google Cloud Platform コンソールで Cloud のログとエラーレポートを表示するをご覧ください。
実行
Apps Script では、スクリプトを実行するたびに、Cloud ログを含む実行の記録が作成されます。これらのレコードは、スクリプトが実行したアクションを把握するのに役立ちます。
Apps Script プロジェクトでのスクリプトの実行を表示するには、左側にある [Executions]
をクリックします。Apps Script サービスのステータスを確認する
まれですが、特定の Google Workspace サービス(Gmail やドライブなど)で一時的な問題が発生し、サービスの停止につながることがあります。これが発生すると、これらのサービスとやり取りする Apps Script プロジェクトが想定どおりに機能しなくなる可能性があります。
Google Workspace サービスが停止しているかどうかを確認するには、Google Workspace ステータス ダッシュボードを表示します。現在サービス停止が発生している場合は、復旧を待つか、Google Workspace ヘルプセンターまたは Google Workspace の既知の問題のドキュメントをご覧ください。
デバッガとブレークポイントを使用する
スクリプトの問題を見つけるには、デバッグモードでスクリプトを実行します。デバッグモードで実行すると、ブレークポイント(スクリプト内でハイライト表示されている行のうち、問題があると思われる行)に達すると一時停止します。スクリプトが一時停止すると、その時点での各変数の値が表示されます。これにより、大量のログ ステートメントを追加しなくても、スクリプトの内部動作を検査できます。
ブレークポイントを追加する
ブレークポイントを追加するには、ブレークポイントを追加する行の行番号にカーソルを合わせます。行番号の左側にある円をクリックします。次の図は、スクリプトに追加されたブレークポイントの例を示しています。
デバッグモードでスクリプトを実行する
スクリプトをデバッグモードで実行するには、エディタの上部にある [Debug] をクリックします。
スクリプトはブレークポイントの行を実行する前に一時停止し、デバッグ情報の表を表示します。このテーブルを使用して、パラメータの値やオブジェクトに保存されている情報などのデータを検査できます。
スクリプトの実行方法を制御するには、[Debugger] パネルの上部にある [Step in] ボタン、[Step over] ボタン、[Step out] ボタンを使用します。これにより、スクリプトを一度に 1 行ずつ実行して、時間の経過に伴う値の変化を調べることができます。
複数の Google アカウントに関する問題
複数の Google アカウントに同時にログインすると、アドオンやウェブアプリへのアクセスに問題が発生することがあります。マルチログイン、つまり一度に複数の Google アカウントにログインすることは、Apps Script、アドオン、ウェブアプリではサポートされていません。
複数のアカウントにログインしている間に Apps Script エディタを開いた場合は、使用するアカウントの選択を求められます。
ウェブアプリやアドオンを開いたときにマルチログインの問題が発生する場合は、次のいずれかの解決策をお試しください。
- すべての Google アカウントからログアウトし、アクセスしたいアドオンまたはウェブアプリがあるアカウントにのみログインします。
- Google Chrome でシークレット ウィンドウまたは同等のシークレット ブラウジング ウィンドウを開き、アクセスするアドオンまたはウェブアプリがある Google アカウントにログインします。
困ったときは
上記のツールと手法を使用して問題をデバッグすると、さまざまな問題を解決できますが、解決するために追加のサポートを必要とする問題が存在する場合があります。質問やバグの報告方法については、サポートページをご覧ください。