CHECK_QUERY_IN_CONTENT — Le script AppScript pour auditer ton exact match en masse

Cette page accompagne un post LinkedIn sur l'exact match en SEO. Tu trouveras ici le script AppScript complet, les instructions d'installation et la formule à utiliser dans Google Sheets.

C'est quoi CHECK_QUERY_IN_CONTENT ?

Une fonction personnalisée pour Google Sheets qui vérifie si une requête donnée apparaît en exact match dans le contenu principal d'une URL. Elle s'utilise directement comme une formule native, sur autant de lignes que tu veux.

Cas d'usage : tu exportes tes couples URL × requête depuis la Google Search Console, tu lances la formule, et tu obtiens en quelques secondes la liste des pages où la requête cible est absente du contenu. Ce sont tes quick wins SEO immédiats.

Pourquoi ça marche ?

Paul Grillet (voir le post) a analysé plus d'un million de couples URL × requête.

Résultat : passer de 0 à 1 occurrence de la requête exacte dans le body d'une page multiplie par 1,64 les chances d'être dans le top 10, et par 1,93 les chances d'être dans le top 3. L'exact match porte 2 à 3x plus fort que le partial match sur le trafic réel.

Installation

Étape 1 — Prépare ton Google Sheet

Ouvre un Google Sheet et organise tes données sur trois colonnes :

  • Colonne A : l'URL de la page à auditer
  • Colonne B : la requête GSC à vérifier
  • Colonne C,D,E : clics, impressions, position (optionnel, pour prioriser)

Tu peux exporter ces données directement depuis Google Search Console.

Étape 2 — Ouvre l'éditeur AppScript

Dans ton Google Sheet : Extensions → Apps Script.

Une nouvelle fenêtre s'ouvre. Supprime le contenu par défaut et colle le code ci-dessous.

Étape 3 — Colle le script

function CHECK_QUERY_IN_CONTENT(url, query) {
  try {
    const response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
    const html = response.getContentText();

    const mainMatch = html.match(/<main[^>]*>([\s\S]*?)<\/main>/i);
    const mainContent = mainMatch ? mainMatch[1] : html;

    const paragraphs = [...mainContent.matchAll(/<p[^>]*>([\s\S]*?)<\/p>/gi)]
      .map(m => m[1].replace(/<[^>]+>/g, '').toLowerCase())
      .join(' ');

    return paragraphs.includes(query.toLowerCase()) ? 'OUI' : 'NON';

  } catch (e) {
    return 'ERREUR';
  }
}

Clique sur Enregistrer (icône disquette ou Ctrl+S), puis ferme l'éditeur AppScript.

Étape 4 — Utilise la formule

Dans la colonne D de ton sheet, entre la formule suivante sur la première ligne de données :

=CHECK_QUERY_IN_CONTENT(A2, B2)

Étire ensuite la formule vers le bas sur toutes tes lignes. Le script va crawler chaque URL et retourner OUI ou NON selon que la requête exacte est présente dans le contenu de la page.

Interpréter les résultats

NON : la requête n'apparaît pas en exact match dans le contenu. C'est un quick win immédiat — ajoute-la naturellement dans le texte, dans un titre H2 ou H3 si c'est pertinent, ou dans une phrase introductive.

OUI : la requête est présente. Si la page est quand même en position 11-30, le problème vient d'ailleurs (maillage interne, autorité, UX, contenu insuffisant).

ERREUR : l'URL est inaccessible, redirigée ou bloque le crawl. À investiguer séparément.

Conseils d'utilisation

  • Commence par filtrer les positions 10-30 dans ta GSC avant d'exporter — ce sont les pages avec le plus fort potentiel de gain rapide.
  • Ne traite pas plus de 200-300 URLs en une seule fois, AppScript a des limites de temps d'exécution.
  • Si le script retourne systématiquement NON sur des pages où tu sais que la requête est présente, c'est que le contenu est rendu en JavaScript — le script ne crawle pas le JS, uniquement le HTML statique.
  • Ajoute la requête de façon naturelle, jamais en bourrage. Une seule occurrence bien placée suffit.

Limites du script

Le script analyse uniquement le contenu de la balise <main> quand elle existe, ou le body complet en fallback. Il ne prend pas en compte le contenu rendu côté client (React, Vue, etc.), les iframes, ni les contenus derrière authentification. Pour les sites JavaScript-heavy, une analyse via Screaming Frog ou une API de rendu sera plus fiable.


Des questions sur l'utilisation du script ? Retrouve la discussion dans les commentaires du post LinkedIn ou écris à contact@empirik.fr.