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
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

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

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.
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.
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.
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
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 📈







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.
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