Annonces responsives sur le Réseau de Recherche incomplètes : comment arrêter de les ignorer
Les annonces responsives sur le Réseau de Recherche sont un format « gentil » uniquement en apparence. Google vous dit : « Écrivez jusqu’à 15 titres et 4 descriptions, puis je m’occuperai de tout combiner ». Et tu te dis : ok, parfait, je le ferai… dès que j’aurai le temps. Puis les semaines passent. Vous changez de campagne, ouvrez de nouveaux groupes, dupliquez des annonces, faites des tests A/B. Un collègue entre, un collègue sort et pendant ce temps certains RSA se retrouvent avec 8 titres et 2 descriptions, comme une valise scellée avec du scotch : est-ce que ça marche ?… peut-être, mais ce n’est pas vraiment le mieux.
Le problème c’est que cette incomplétude ne fait pas de bruit, elle n’envoie pas (toujours) de notifications. Il fonctionne simplement en dessous de son potentiel. Et vous ne le remarquez que lorsque vous commencez à regarder les annonces une à une (c’est-à-dire : jamais). C’est là qu’est né ce script : une petite sentinelle qui parcourt le compte et applique une étiquette là où c’est nécessaire, sans causer de dommages collatéraux.
Le scénario
/**
* Google Ads Script
* Label "INCOMPLETO" su Responsive Search Ads (RSA) attivi che hanno:
* - < 15 titoli OR < 4 descrizioni
* In campagne ENABLED + ad group ENABLED + ad ENABLED.
*
* Ogni run (LIVE):
* 1) rimuove SOLO la label INCOMPLETO da tutto ciò che la possiede
* 2) ricalcola e riapplica la label solo agli incompleti
*
* In PREVIEW:
* - non crea label
* - non rimuove / applica label
* - fa solo scan e log dei conteggi
* - Copyright SDB srl 2026
*/
// =====================
// CONFIG
// =====================
var LABEL_INCOMPLETO = "INCOMPLETO";
var PREVIEW_ONLY = true; // true = preview (solo log) | false = live (applica davvero)
var MIN_HEADLINES = 15;
var MIN_DESCRIPTIONS = 4;
function main() {
// 0) Recupero label (in preview NON la creo)
var label = PREVIEW_ONLY
? getLabelIfExists_(LABEL_INCOMPLETO)
: getOrCreateLabelLive_(LABEL_INCOMPLETO);
// 1) RESET: rimuove SOLO la label INCOMPLETO (solo LIVE e solo se label esiste)
var resetFound = 0;
var resetRemoved = 0;
if (!PREVIEW_ONLY && label) {
var labeledAdsIter = label.ads().get();
while (labeledAdsIter.hasNext()) {
var ad = labeledAdsIter.next();
resetFound++;
ad.removeLabel(LABEL_INCOMPLETO); // rimuove SOLO questa label
resetRemoved++;
}
}
// 2) SCAN: trova gli RSA "incompleti"
var scannedRsa = 0;
var incompleteFound = 0;
var labeledApplied = 0;
var rsaIter = AdsApp.ads()
.withCondition("Type = RESPONSIVE_SEARCH_AD")
.withCondition("CampaignStatus = ENABLED")
.withCondition("AdGroupStatus = ENABLED")
.withCondition("Status = ENABLED")
.get();
while (rsaIter.hasNext()) {
var ad = rsaIter.next();
scannedRsa++;
var rsa = ad.asType().responsiveSearchAd();
var headlinesCount = safeLength_(rsa.getHeadlines());
var descriptionsCount = safeLength_(rsa.getDescriptions());
var isIncomplete = (headlinesCount < MIN_HEADLINES) || (descriptionsCount < MIN_DESCRIPTIONS);
if (isIncomplete) {
incompleteFound++;
if (!PREVIEW_ONLY) {
// in LIVE la label esiste per forza (creata sopra), quindi posso applicare
ad.applyLabel(LABEL_INCOMPLETO);
labeledApplied++;
}
}
}
// 3) LOG (solo numeri + mode + info label)
Logger.log("MODE: " + (PREVIEW_ONLY ? "PREVIEW" : "LIVE"));
Logger.log("LABEL_EXISTS: " + (label ? "YES" : "NO"));
if (PREVIEW_ONLY && !label) {
Logger.log("NOTE: In PREVIEW non creo label. Passa a LIVE per creare/applicare 'INCOMPLETO'.");
}
Logger.log("RESET_FOUND_INCOMPLETO: " + resetFound);
Logger.log("RESET_REMOVED_INCOMPLETO: " + resetRemoved);
Logger.log("RSA_SCANNED: " + scannedRsa);
Logger.log("RSA_INCOMPLETI_FOUND: " + incompleteFound);
Logger.log("RSA_INCOMPLETI_LABELED: " + labeledApplied);
}
// ---------------------
// Helpers
// ---------------------
/**
* PREVIEW SAFE: restituisce la label se esiste, altrimenti null.
*/
function getLabelIfExists_(labelName) {
var it = AdsApp.labels().withCondition("Name="" + escapeQuotes_(labelName) + """).get();
return it.hasNext() ? it.next() : null;
}
/**
* LIVE: se non esiste la crea davvero, poi la recupera con retry.
*/
function getOrCreateLabelLive_(labelName) {
var label = getLabelIfExists_(labelName);
if (label) return label;
// Creo
AdsApp.createLabel(labelName);
// Retry (a volte c'è un micro-delay di consistenza)
for (var i = 0; i < 5; i++) {
label = getLabelIfExists_(labelName);
if (label) return label;
}
throw new Error("Non riesco a creare o recuperare la label '" + labelName + "' in LIVE. Verifica che lo script sia eseguito dentro un ACCOUNT (non MCC) e abbia permessi di modifica.");
}
function safeLength_(arr) {
if (!arr) return 0;
try {
return arr.length || 0;
} catch (e) {
return 0;
}
}
function escapeQuotes_(s) {
return String(s).replace(/'/g, "\'");
}
La notion
Une annonce RSA complète utilise 15 titres et 4 descriptions. Non pas parce que Google le souhaite, mais parce que plus vous disposez d’actifs, plus il peut tester de combinaisons, plus il collecte de signaux, plus il peut s’adapter à différentes requêtes et contextes. Cependant, lorsque l’annonce comporte moins d’éléments :
- réduire la variété sémantique (moins d’angles d’attaque),
- réduire la couverture (moins de chances de faire correspondre différentes intentions),
- réduire la capacité d’apprentissage (moins de combinaisons testables).
En pratique vous utilisez un format « dynamique » en mode « statique ».
Ce que fait le script
Le script analyse toutes les annonces responsives sur le Réseau de Recherche actives trouvées dans les campagnes, groupes d’annonces et annonces actifs et identifie celles qui sont incomplètes, c’est-à-dire :
- moins de 15 titres ou,
- moins de 4 descriptions.
C’est alors que le label « INCOMPLETO » entre en jeu.
Deux modes : Aperçu et Live
1) APERÇU (PREVIEW_ONLY = vrai)
C’est le mode « les mains dans la poche ». Il ne crée pas d’étiquettes, ne les supprime pas et ne les applique pas. Il effectue simplement une analyse et écrit dans le journal le nombre d’annonces incomplètes. Il est parfait pour :
- comprendre l’ampleur du problème,
- prendre un premier instantané du compte,
- éviter les changements « surprises » dans les environnements délicats.
À la fin, vous trouverez des chiffres clairs dans le journal, comme le nombre d’annonces analysées et combien d’annonces sont incomplètes.
2) EN DIRECT (PREVIEW_ONLY = faux)
Ici, le script fonctionne vraiment. Et l’important, c’est comment cela fonctionne : d’abord, il nettoie, puis il recalcule.
La réinitialisation intelligente
Chaque performance LIVE fait cette séquence :
- supprime UNIQUEMENT l’étiquette « INCOMPLET » de tout ce qui la porte,
- réanalyser les annonces actives,
- réappliquez le libellé uniquement aux annonces qui sont incomplètes à ce moment-là.
Cela résout un problème très courant : les anciennes étiquettes. Car il peut arriver que :
- hier une annonce était incomplète = libellé appliqué
- aujourd’hui tu l’as réparé = mais l’étiquette est toujours là
Le script empêche le compte de se remplir d’étiquettes zombies. Il effectue une réinitialisation : il supprime uniquement « INCOMPLETE », il ne touche à rien d’autre.
Que trouve-t-on dans les journaux
Le script imprime toujours :
- MODE : APERÇU ou LIVE
- LABEL_EXISTS : OUI/NON
- réinitialiser le compte (LIVE uniquement)
- combien de RSA ont été analysés
- combien sont incomplets
- combien ont reçu le label
Ainsi même sans ouvrir l’interface, vous comprenez immédiatement ce qui se passe.
Parce que c’est nécessaire
Parce que les comptes croissent de manière asymétrique. Peut-être que vous êtes doué pour les campagnes principales, mais il y a aussi :
- la campagne « test » devenue permanente,
- le groupe d’annonces en double « juste pour essayer »,
- l’annonce créée à la volée pour une promo et jamais revue,
- le nouveau responsable de compte qui n’est pas aussi soucieux des détails.
Ce script est un moyen simple de transformer une bonne pratique en une routine automatique.
Comment l’utiliser pratiquement
- Collez le script dans les scripts Google Ads (dans votre compte, pas dans MCC).
- Laissez PREVIEW_ONLY = true.
- Courez et regardez les journaux.
- Si les chiffres ont du sens, passez à PREVIEW_ONLY = false.
- (facultatif) Planifiez une exécution récurrente (par exemple quotidienne ou hebdomadaire).
À ce stade, l’étiquette « INCOMPLETO » devient une liste de choses à faire vivante :
- cliquez sur l’étiquette,
- voir les annonces à compléter,
- réparez-les,
- lors de la prochaine exécution, ils disparaissent automatiquement de la liste.
Les RSA incomplets ne sont pas une erreur évidente : ils fonctionnent, mais ils ne poussent pas. Ils sont là, mais ils ne font pas tout ce qu’ils peuvent. Avec ce script, au lieu de vous lancer dans une chasse manuelle, vous laissez le compte vous dire : « ces publicités n’exploitent pas le format. Corrigez-les ». Et il le fait avec un seul label, mis à jour à chaque exécution, sans encombrer l’écosystème de tags, sans dérouter l’équipe, sans créer le chaos.
