Tehokas sisällön optimointi Google Search Consolen ja Apps Scriptin avulla

Kesäkuussa 2025 pidin esityksen tehokkaasta sisällön optimoinnista Google Search Consolen ja Apps Scriptin avulla WTS FEST Berlinissä. Löydät täältä esitysdiojeni, ‘Miten teen sen’ -videoni sekä Google Apps Script -skriptit, joita käytän sisällön optimointiin Google Search Console -datan avulla. Tässä käytännönläheisessä esityksessä opit, miten voit hyödyntää Google Search Console -dataa yhdessä Google Apps Scriptin kanssa sisällön uudelleenoptimointiin, uusien ideoiden löytämiseen ja tiettyjen SEO-tehtävien automatisointiin ajan säästämiseksi. Jos teet aivan uutta sisältöä ja sinulla ei ole vielä Search Console dataa, suosittelen katsomaan miten tehdä avainsana-analyysi maksetuilla työkailuilla kuten esim. Ahrefs. Jos SEO on sinulle uusi juttu, suosittelen katsomaan hakukoneoptimointi-oppaani.

Esitys

https://speakerdeck.com/katarinadahlin/wtsfest-berlin-25

Ohjevideo

Näin optimoin sisältöä Google Search Console -datan ja Google Apps Scriptin avulla. Katso video Youtubessa.

Kuka on Katarina Dahlin?

Katarina on Senior Growth Hacker ja SEO-konsultti. Yli 6 vuoden kokemuksella SEO:sta ja digitaalisesta markkinoinnista Katarina kasvattaa tehokkaasti asiakkaidensa orgaanista liikennettä.

Lue myös Women in Tech SEO:n tekemäni haastattelu.

Kuinka optimoida vanha sisältö tehokkaasti Google Search Consolen ja Apps Scriptin avulla

Tässä käytännönläheisessä esityksessä opit, miten voit hyödyntää Google Search Console -dataa yhdessä Google Apps Scriptin kanssa sisällön uudelleenoptimointiin, uusien ideoiden löytämiseen ja tiettyjen SEO-tehtävien automatisointiin ajan säästämiseksi.

Uusi sisältö vs. vanhan sisällön optimointi

Miksi optimoida olemassa olevaa sisältöä?
→ Paranna jo menestyksekkäitä sivuja
Jos Google jo pitää sivustasi ja sijoittaa sen korkealle, on helpompaa saada sama sivu sijoittumaan myös pitkän hännän hakusanoille.
→ Lisää sivuja ei tarkoita enemmän orgaanista liikennettä.
Et aina tarvitse uutta sisältöä. 20 % sivuista voi tuoda 80 % liikenteestä, liideistä ja tuloista.
→ Olemassa olevien sivujen optimointi vaatii vähemmän vaivaa kuin uusien luominen.
Sisällön laatu on tärkeämpää kuin koskaan.

Halusin löytää hyvän tavan optimoida vanhaa sisältöä.

Prosessini

Katarina Dahlin - Efficient Content Optimization with Google Search Console & Apps Script - My process

Vie kaikki Search Console -data taulukkoon
→ Yhdistä hakusana ja laskeutumissivu
→ Käytä työkaluja kuten ‘Search Analytics for Sheets’ tai ‘Supermetrics’ raakadatan hakemiseen.

Google Sheetsissa käytä Google Apps Scriptiä lisädatan hakemiseen
→ Tarkista, löytyvätkö sanat sisällöstä
→ Tuo metatitlet

Aloita datan analysointi suoraan taulukossa tai luo visuaalinen Looker Studio optimointityötä varten.

Optimoi!
→ Etsi hakusanoja, jotka sijoittuvat hyvin mutta puuttuvat sisällöstä. Lisää ne sisältöön.
→ Optimoi metatitlet lisäämällä hakusanoja
→ Tunnista kannibalismit

Hae Google Search Console -data

Google Search Console -data on loistava työkalu uusien hakusanojen löytämiseen ja vanhan sisällön optimointiin, mutta pelkän käyttöliittymän käyttämisessä on muutamia ongelmia…
→ Suodatus jättää dataa pois (hakukyselyt, klikkaukset, näyttökerrat) yksityisyyssyistä. Esimerkiksi kukkaviljelyblogissani 35 % kyselyistä oli piilotettu.
→ Käyttöliittymässä on hieman kömpelöä työskennellä.
→ Voit viedä kerrallaan vain 1 000 hakukyselyä.

Ratkaisu: Vie Google Search Console -raakadata Google Sheetiin.
Käytä työkaluja kuten ‘Search Analytics for Sheets’ tai ‘Supermetrics’.
Search Analytics for Sheets on ilmainen jopa 25 000 riville.
→ Supermetrics maksaa 29–399 € / kuukausi, mutta sen avulla voit helposti viedä myös muuta dataa Google Sheetsiin, kuten Analytics- tai mainosdataa.

Molemmat työkalut toimivat hyvin ja samankaltaisesti! Katso asetukset alla olevasta kuvasta.

Ota raakadata.
Älä vielä suodata tässä vaiheessa, koska suodatus jättää tietoja pois.
Yhdistä hakukysely ja laskeutumissivu.
Dimensiot: Sivu, Kysely
Mittarit: Klikkaukset, Näyttökerrat, CTR ja Sijoitus

→ Nyt sinulla on suurin mahdollinen datamäärä, jonka voit saada API:n kautta.
Voit nyt jo:
→ Nähdä kaikki hakusanat, joilla sivu sijoittuu
→ Suodattaa helposti ilman datan häviämistä
→ Nähdä klikkaukset, näyttökerrat ja sijoitukset hakukysely- ja laskeutumissivukohtaisesti

Katarina Dahlin Search Console data

Hae lisää dataa Google Apps Scriptillä parempaa analyysia varten

Mikä on Google Apps Script?
→ Google Apps Script on skriptikieli, jolla voi automatisoida tiettyjä tehtäviä Google Sheetsissa ja säästää aikaa manuaaliselta työltä.

Käytän sitä Google Search Console -datan kanssa seuraavilla tavoilla:

1. Tunnista kannibalismit

Tunnista kannibalismit yhdistämällä hakusana ja laskeutumissivu.
→ Lajittele kyselyjen mukaan
→ Katso sivu, näyttökerrat ja sijoitus
→ Mikä sivu suoriutuu parhaiten?

Harkitse:
→ sivujen sisällön yhdistämistä
→ heikommin suoriutuvien sivujen poistamista
→ jos sivuja ei voi poistaa (esim. tuotesivut), lisää sisäisiä linkkejä parhaiten suoriutuvalle sivulle.

Katarina Dahlin - tunnista kannibalismit

2. Optimoi metatitlet

Helpoin tapa parantaa sijoituksia on optimoida metatitlet.

→ Hae metatitlet Google Apps Scriptillä tai Screaming Frogilla.
→ Lajittele laskeutumissivun mukaan löytääksesi hakusanoja, joita voit lisätä titleihin.

Katarina Dahlin - optimoi metatitlet

Metatitle-tarkistus Apps Script osa 1.

Tämä metatitle-Apps Script hakee metatitlen sarakkeeseen I sarakkeessa A olevasta URL:sta Google Sheetissä.

function importMetaTitle() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  const startRow = Number(PropertiesService.getScriptProperties().getProperty('lastProcessedRowMetaTitle')) || 2; // Start at saved row or row 2
  const chunkSize = 100; // Process 100 rows per run
  Logger.log(`Starting from row: ${startRow}`);
  for (let i = startRow; i <= lastRow && i < startRow + chunkSize; i++) {
    const url = sheet.getRange(i, 1).getValue();
    if (!url) continue; // Skip empty URL cells
    try {
      // Fetch the URL and allow non-200 responses without throwing an exception
      const response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
      const responseCode = response.getResponseCode();
      
      // If the response code is not 200, record the error code in column I and continue to the next row
      if (responseCode !== 200) {
        sheet.getRange(i, 9).setValue("Error: " + responseCode);
        continue;
      }
      
      // Get the HTML content and extract the  tag
      const htmlContent = response.getContentText();
      const titleMatch = htmlContent.match(/<title[^>]*>([^<]+)<\/title>/i);
      
      if (titleMatch && titleMatch[1]) {
        const metaTitle = titleMatch[1].trim();
        sheet.getRange(i, 9).setValue(metaTitle);
      } else {
        sheet.getRange(i, 9).setValue("No title found");
      }
    } catch (e) {
      sheet.getRange(i, 9).setValue("Error: " + e.message);
    }
  }
  // Save progress: update the next starting row or clear progress if complete
  const nextRow = startRow + chunkSize;
  if (nextRow <= lastRow) {
    PropertiesService.getScriptProperties().setProperty('lastProcessedRowMetaTitle', nextRow);
    Logger.log(`Saved progress. Next start row: ${nextRow}`);
  } else {
    PropertiesService.getScriptProperties().deleteProperty('lastProcessedRowMetaTitle');
    Logger.log('Processing complete or reached row limit!');
  }
}</code></pre>

Metatitle-tarkistus Apps Script osa 2.

Tämä Apps Script nollaa skriptin 1 aloittamaan titlejen hakemisen uudelleen riviltä 2 eikä siitä, mihin se viimeksi jäi.

// Reset the meta title progress to start the script from row 2
function resetMetaTitleProgress() {
  PropertiesService.getScriptProperties().deleteProperty('lastProcessedRowMetaTitle');
  Logger.log('Meta title progress has been reset. The script will start from row 2.');
}

// Check the saved meta title progress to see where the script left off
function checkMetaTitleProgress() {
  const progress = PropertiesService.getScriptProperties().getProperty('lastProcessedRowMetaTitle');
  Logger.log('Meta title - Last processed row: ' + (progress || 'None (reset or not started yet)'));
}

3. Löydä kysymykset FAQ-osiota varten

Löydä usein kysytyt kysymykset hyödyllisen sisällön optimointia varten.
→ Lisää kysymys H2-otsikkona sisältöösi ja pyri näkymään featured snippet- tai “ihmiset kysyvät myös” -osiossa.

Katarina Dahlin - Löydä kysymykset FAQ-osiota varten

4. Tarkista, käytetäänkö hakusanaa sisällössäsi

Hyvän sijoituksen saavuttamiseksi on tärkeää sisällyttää sisältöön hakusanoja, jotka vastaavat ihmisten käyttämiä hakutermejä.

→ Löytyykö sijalla 5–30 sijoittuva hakusana sivulta?
Jos ei, lisää se sivulle! Se on helppo voitto 🍎

Hyvin sijoittuvien mutta puuttuvien hakusanojen lisääminen sisältöön auttaa niitä sijoittumaan paremmin.
→ toimii matalan kilpailun hakusanoilla
→ saat enemmän pitkän hännän hakusanoja sijoittumaan paremmin

Katarina Dahlin - tarkista löytyykö hakusana sivulta vai ei

Kuinka tarkistaa, löytyykö hakusana sivulta Google Apps Scriptin avulla

Google Apps Scriptin rakentaminen
→ Pyydä ChatGPT:tä luomaan Google Apps Script puolestasi – selitä vain, mitä haluat tehdä.
→ Testaa Google Apps Script ja muokkaa sitä tarpeidesi mukaan – pyydä ChatGPT:tä tekemään muutoksia skriptiisi!

Esimerkkiprompt aloitukseen:
Luo Google Apps Script, joka tarkistaa, löytyykö sarakkeessa B oleva hakusana sarakkeessa A olevalta sivulta samalla rivillä, ja lisää tulos sarakkeeseen G muodossa “not found” tai “found”.

Voit myös käyttää omaa Google Apps Scriptiäni hakusanan löytymisen tarkistamiseen. Muokkaa sitä ChatGPT:n avulla, jos tarkistat eri sarakkeita tai haluat tuloksen eri sarakkeeseen.

Tämä skripti on myös kaksivaiheinen. Ensimmäinen skripti tarkistaa, löytyykö hakusana sivulta vai ei, ja jatkaa seuraavasta rivistä, johon se viimeksi jäi. Toinen skripti nollaa aloitusrivin, jolloin tarkistus alkaa uudelleen riviltä 2.

Google Apps Script hakusanan löytymisen tarkistamiseen osa 1.

Aja tämä skripti tarkistaaksesi, löytyykö sarakkeessa B oleva hakusana sarakkeessa A olevalta sivulta vai ei. Tulokset lisätään sarakkeeseen G muodossa Found tai Not found. Se tarkistaa 100 riviä per ajo ja jatkaa seuraavasta rivistä, kun skripti ajetaan uudelleen.

function checkKeywordInPage() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  const maxRows = 8000; // Limit to 8000 rows
  const startRow = Number(PropertiesService.getScriptProperties().getProperty('lastProcessedRow')) || 2; // Start at saved row or row 2
  const chunkSize = 100; // Process 100 rows per run
  Logger.log(`Starting from row: ${startRow}`);
  for (let i = startRow; i <= lastRow && i < startRow + chunkSize && i <= maxRows; i++) {
    const url = sheet.getRange(i, 1).getValue();
    const keyword = sheet.getRange(i, 2).getValue().toLowerCase(); // Convert keyword to lowercase
    try {
      // Use muteHttpExceptions to handle non-200 responses without throwing an error
      const response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
      const responseCode = response.getResponseCode();
      
      // If URL returns a 404 error, mark it and skip keyword checking.
      if (responseCode === 404) {
        sheet.getRange(i, 7).setValue("404");
        continue;
      }
      
      const content = response.getContentText().toLowerCase(); // Convert page content to lowercase
      // Replace spaces in the keyword with optional hyphen regex pattern
      const modifiedKeyword = keyword.replace(/\s+/g, '[-\\s]*');
      const keywordRegex = new RegExp(modifiedKeyword, 'i'); // Case-insensitive regex for the modified keyword
      if (keywordRegex.test(content)) {
        sheet.getRange(i, 7).setValue("Found");
      } else {
        sheet.getRange(i, 7).setValue("Not Found");
      }
    } catch (e) {
      sheet.getRange(i, 7).setValue("Error: " + e.message);
    }
  }
  // Save progress
  const nextRow = startRow + chunkSize;
  if (nextRow <= lastRow && nextRow <= maxRows) {
    PropertiesService.getScriptProperties().setProperty('lastProcessedRow', nextRow);
    Logger.log(`Saved progress. Next start row: ${nextRow}`);
  } else {
    PropertiesService.getScriptProperties().deleteProperty('lastProcessedRow'); // Reset when done
    Logger.log('Processing complete or reached row limit!');
  }
}
function resetProgress() {
  // Manually reset the progress
  PropertiesService.getScriptProperties().deleteProperty('lastProcessedRow');
  Logger.log('Progress has been reset.');
}

Google Apps Script hakusanan löytymisen tarkistamiseen osa 2.

Tämä skripti nollaa ensimmäisen skriptin aloittamaan uudelleen riviltä 2.

// Reset the progress to start the script from row 2
function resetProgress() {
  PropertiesService.getScriptProperties().deleteProperty('lastProcessedRow');
  Logger.log('Progress has been reset. The script will start from row 2.');
}

// Check the saved progress to see where the script left off
function checkProgress() {
  const progress = PropertiesService.getScriptProperties().getProperty('lastProcessedRow');
  Logger.log('Last processed row: ' + (progress || 'None (reset or not started yet)'));
}

Google Apps Scriptin rakentaminen askel askeleelta

→ Löydä Apps Script Google Sheetin Laajennukset-valikosta.
→ Luo uusi skripti.
→ Aloita tyhjästä ja lisää skripti.
→ Aja skripti!
→ Katso tulos: löytyykö hakusana sivulta vai ei.
→ Ota puuttuvat sanat ja lisää ne sijoittuvalle sivulle 📈

Katarina Dahlin - Google apps script 1
Katarina Dahlin - Google apps script 2
Katarina Dahlin - Google apps script 3
Katarina Dahlin - Google apps script 4
Katarina Dahlin - Google apps script 5
Katarina Dahlin - Google apps script 6
Katarina Dahlin - Google apps script 7

Luo visuaalinen Looker Studio -näkymä yleisimmin käytettyjä suodattimia varten

Oma sivu per suodatin. Esimerkkejä suodatinnäkymistä:
→ Vain brändätyt kyselyt
→ Brändätyt kyselyt poistettu
→ Tuotesivut
→ Kategorisivut
→ Blogiartikkelit
→ FAQ-haut
→ Hakusanat tai aiheet

Lisää mahdollisuus suodattaa Looker Studio -näkymän sisällä.
Seuraa klikkauksia ja näyttökertoja (data suoraan Google Search Consolesta).
Pidä hakusana + laskeutumissivu -data klikkauksineen, näyttökertoineen, CTR:ineen, sijoituksineen sekä Found/Not found -tietoineen.
Päivitä data tarpeen mukaan: joka 28. päivä, joka 3. kuukausi tai joka 6. kuukausi.

Esimerkki yhdestä suodatinsivustani.

Katarina Dahlin - visuaalinen Looker Studio -näkymä yleisimmin käytetyille suodattimille

Yhteenveto

Paranna jo menestyksekkäitä sivuja uudelleenoptimoimalla Google Search Console -datan avulla.

Vie kaikki mahdollinen data Google Sheetiin.
Yhdistä hakukysely + laskeutumissivu.

Työkalut:
→ Supermetrics
→ Search Analytics for Sheets.

Hae lisää dataa Apps Scripteillä ja optimoi!
→ metatitlet
→ tarkista, löytyykö hakusana sivulta

Rakenna Looker Studio sisällön optimointia varten.
→ suodatinnäkymät eri sisältöklustereille tai sivutyypeille

Kiitos, että luit näin pitkälle!

/ Katarina

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

0