Sentryエラー: gmo変数が見つからない原因と対処法
概要
ReactアプリにGoogle Adsタグを導入した後、Sentryで以下の2つのエラーが頻発する現象:
Can't find variable: gmoInvalid or unexpected token
問題の詳細と原因
発生しているエラー
- gmo変数未定義エラー
Can't find variable: gmoはGoogleマーケティングタグ内で参照されるgmoオブジェクトが存在しない場合に発生 - 無効トークンエラー
Invalid or unexpected tokenはGoogleアドクリックから付与されるURLパラメータ(例:gclid)が不正な形式を含む場合に発生
根本原因
- Googleタグスクリプトとの相互作用
Google Adsタグが注入するgmoオブジェクトが初期化前に参照される - 広告パラメータ処理不足
アプリ内でURLクエリパラメータ(特に広告関連パラメータ)を適切に処理するロジックが欠如
html
<!-- 問題の原因となるGoogleタグスクリプト例 -->
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'AW-123456789'); // ここでgmoを参照する可能性あり
</script>影響範囲
これらのエラーはアプリの機能を阻害せず、ユーザー操作に影響しないため緊急度は低い
推奨解決策
1. Sentryでエラーを無視する設定(最適解)
推奨理由:
- Googleスクリプト起因のエラーを根本的に解決するのは困難
- 非同期ロードされる外部スクリプトのため制御不能
- 公式ドキュメントでも外部スクリプトエラーの無視を推奨
javascript
Sentry.init({
ignoreErrors: [
"Can't find variable: gmo",
/invalid or unexpected token/i // 正規表現で類似エラーをキャッチ
],
denyUrls: [ // Googleタグ関連スクリプトを除外
/https:\/\/www\.googletagmanager\.com\/gtag\/js/
]
});2. リスク回避策(オプション)
gmo変数の予防的初期化
html
<script>
// gmoオブジェクトを先行して定義
window.gmo = window.gmo || {};
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'AW-123456789');
</script>クエリパラメータ処理の追加
jsx
import { useSearchParams } from 'react-router-dom';
function App() {
const [searchParams] = useSearchParams();
useEffect(() => {
// gclidなどの広告パラメータを検出
const gclid = searchParams.get('gclid');
if (gclid) {
// 例: ローカルストレージに保存
localStorage.setItem('gclid', gclid);
// 広告パラメータをURLから削除(エラー防止)
const url = new URL(window.location);
url.searchParams.delete('gclid');
window.history.replaceState({}, '', url);
}
}, [searchParams]);
}なぜこれらの解決策が有効か
Sentry無視設定のメリット
| メリット | 説明 |
|---|---|
| 即時効果 | 設定変更だけでエラー報告を停止可能 |
| リソース節約 | 無関係なエラー追跡にリソースを割かない |
| 安定性 | 外部スクリプト変更の影響を受けない |
予防的初期化の限界
gmoオブジェクトの仕様は非公開で変わる可能性あり- Google側スクリプトが複数バージョン存在するため根本解決にならない
パラメータ処理の重要性
- 特殊文字を含む広告パラメータが構文エラーを引き起こす
- パラメータ取得後即時にURLから削除するとエラー発生率が低下
結論とベストプラクティス
::: success 推奨対応
最優先でSentryの
ignoreErrors設定を実施
外部スクリプト起因エラーからアラートノイズを削減広告パラメータ処理ロジックを追加
gclidなど特殊パラメータを適切に処理gmo変数の予防的定義は最終手段
動作保証ができないため過度な期待をしない :::
追加アドバイス:
- Googleタグマネージャ経由でスクリプトを管理すると可視性が向上
- 定期的にGoogle広告パラメータの仕様変更をチェック
(例:gclidからgbraidへの移行など)
これらの対策により、Sentryのエラーレポート品質が向上し、重要な問題への対応リソースを集中させることが可能になります。