Skip to content

Sentryエラー: gmo変数が見つからない原因と対処法

概要

ReactアプリにGoogle Adsタグを導入した後、Sentryで以下の2つのエラーが頻発する現象:

  1. Can't find variable: gmo
  2. Invalid 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 推奨対応

  1. 最優先でSentryのignoreErrors設定を実施
    外部スクリプト起因エラーからアラートノイズを削減

  2. 広告パラメータ処理ロジックを追加
    gclidなど特殊パラメータを適切に処理

  3. gmo変数の予防的定義は最終手段
    動作保証ができないため過度な期待をしない :::

追加アドバイス:

  • Googleタグマネージャ経由でスクリプトを管理すると可視性が向上
  • 定期的にGoogle広告パラメータの仕様変更をチェック
    (例: gclidからgbraidへの移行など)

これらの対策により、Sentryのエラーレポート品質が向上し、重要な問題への対応リソースを集中させることが可能になります。