Tutorial

Πώς να έχετε «ζωντανά» δεδομένα, δωρεάν και με λίγες γραμμές κώδικα, στο Google Sheets 

Δες το άρθρο

Με το Google Apps Script και λίγη βοήθεια από οποιοδήποτε chatbot τεχνητής νοημοσύνης, φτιάχνουμε ένα μικρό pipeline συγκέντρωσης δεδομένων σε υπολογιστικό φύλλο που βρίσκεται στο cloud και «τρέχει» χωρίς την παρέμβασή μας

Στο πρώτο βήμα, ανοίγετε ένα Google Sheet και επιλέγετε το Apps Script από τα Extensions.

Η συγκέντρωση δεδομένων για ένα θέμα το οποίο παρέχει νέα στοιχεία σε τακτά χρονικά διαστήματα μπορεί να αποτελεί μια κουραστική διαδικασία, η οποία, όμως, μπορεί να αυτοματοποιηθεί με μερικά εύκολα βήματα, χωρίς να αναγκαστούμε να χρησιμοποιήσουμε εξειδικευμένο ή επί πληρωμή λογισμικό.

Κάτι τέτοιο γίνεται με τη χρήση των υπολογιστικών φύλλων που διαθέτει η Google (Google Sheets) και του συνδεδεμένου με αυτά Google Apps Script, το οποίο αποτελεί cloud πλατφόρμα στην οποία μπορούμε να «τρέξουμε» κώδικα Javascript. Ως ενδεικτικό παράδειγμα, παρακάτω συγκεντρώνουμε, μέσω API, και καθαρίζουμε τα δεδομένα από πίνακα σε σελίδα της Wikipedia που συγκεντρώνει τις ταινίες με τα υψηλότερα έσοδα ανά εβδομάδα.

Αναλυτικά βήματα

Το πρώτο βήμα είναι να μεταφερθούμε στο περιβάλλον των Google Sheets. Εάν διαθέτετε λογαριασμό Google, τότε οποιαδήποτε αλλαγή κάνετε στο υπολογιστικό φύλλο θα αποθηκευθεί στο Drive σας.

Μέσα στο περιβάλλον του υπολογιστικού φύλλου θα βρείτε, στο πάνω μέρος της οθόνης το μενού «extensions» («επεκτάσεις»), εντός του οποίου βρίσκεται το Apps Script.

Εικόνα από το περιβάλλον χρήστη του Apps Script, όπου έχει ενταχθεί ο κώδικας Javascript, που δημιουργήσαμε σε συνεργασία με το Claude.

Όταν το επιλέξετε, θα μεταφερθείτε στο περιβάλλον του Google Apps Script, σε νέα καρτέλα.

Μέσα σε αυτό θα γράψετε τον κώδικα που χρειάζεστε. Στην προκειμένη περίπτωση, σε συνεργασία με το Claude, γράψαμε τον ακόλουθο κώδικα ο οποίος λαμβάνει τα στοιχεία του πίνακα «Number-one films» της ιστοσελίδας μέσω του API της Wikipedia, τα εγγράφει στο υπολογιστικό φύλλο και έπειτα τα «καθαρίζει».

 
function updateBoxOfficeTable() { 

const sheetName = "Box Office"; 

const pageName = "List_of_2026_box_office_number-one_films_in_the_United_States"; 

 

const apiUrl = 

"https://en.wikipedia.org/w/api.php?action=parse&page=" + 

pageName + 

"&prop=text&format=json&origin=*"; 

 

const response = UrlFetchApp.fetch(apiUrl); 

const json = JSON.parse(response.getContentText()); 

 

const html = json.parse.text["*"]; 

 

const tables = html.match( 

/<table[^>]*class="[^"]*wikitable[^"]*"[^>]*>[\s\S]*?<\/table>/gi 

); 

 

if (!tables || tables.length === 0) { 

throw new Error("No Wikipedia tables found."); 

} 

 

let targetTable = null; 

 

for (let table of tables) { 

if (table.includes("Week number")) { 

targetTable = table; 

break; 

} 

} 

 

if (!targetTable) { 

throw new Error("Could not find the box office table."); 

} 

 

const rows = targetTable.match(/<tr[\s\S]*?<\/tr>/gi); 

 

const data = rows.map(row => { 

 

const cells = row.match( 

/<(th|td)[^>]*>[\s\S]*?<\/\1>/gi 

) || []; 

 

return cells.map(cell => { 

 

return cell 

// Remove citations 

.replace(/<sup[^>]*>[\s\S]*?<\/sup>/gi, "") 

// Remove images 

.replace(/<img[^>]*>/gi, "") 

// Replace links with text 

.replace(/<a[^>]*>(.*?)<\/a>/gi, "$1") 

// Remove tags 

.replace(/<[^>]+>/g, "") 

// Decode HTML entities 

.replace(/ /g, " ") 

.replace(/&/g, "&") 

.replace(/"/g, '"') 

.replace(/&#39;/g, "'") 

.replace(/</g, "<") 

.replace(/>/g, ">") 

.trim(); 

 

}); 

 

}); 

 

 

const cleanedData = data.filter(row => row.length > 0); 

 

 

const maxColumns = Math.max( 

...cleanedData.map(row => row.length) 

); 

 

cleanedData.forEach(row => { 

while (row.length < maxColumns) { 

row.push(""); 

} 

}); 

 

 

const ss = SpreadsheetApp.getActiveSpreadsheet(); 

 

let sheet = ss.getSheetByName(sheetName); 

 

if (!sheet) { 

sheet = ss.insertSheet(sheetName); 

} 

 

sheet.clearContents(); 

 

const targetRange = sheet.getRange(1, 1, cleanedData.length, maxColumns); 

 

targetRange.setNumberFormat("@STRING@"); 

targetRange.setValues(cleanedData); 

 

sheet.autoResizeColumns(1, maxColumns); 

} 

 

 

function cleanBoxOfficeTable() { 

const sheet = SpreadsheetApp.getActiveSpreadsheet() 

.getSheetByName("Box Office"); 

 

const range = sheet.getDataRange(); 

const values = range.getValues(); 

 

values[0][0] = "#"; 

 

let lastFilm = ""; 

 

for (let i = 1; i < values.length; i++) { 


const filmCell = values[i][2]; 

const filmCellStr = filmCell instanceof Date 

? Utilities.formatDate(filmCell, Session.getScriptTimeZone(), "M/d/yyyy") 

: String(filmCell); 

 


if (filmCellStr.trim().startsWith("$")) { 

values[i][5] = values[i][4]; 

values[i][4] = values[i][3]; 

values[i][3] = values[i][2]; 

values[i][2] = ""; 

} 

 

if (values[i][2] === "" || values[i][2] === null) { 

values[i][2] = lastFilm; 

} else { 

lastFilm = values[i][2]; 

} 

} 

 

range.setNumberFormat("@STRING@"); 

range.setValues(values); 

 

sheet.autoResizeColumns(1, 6); 

} 

Αυτό πραγματοποιείται με δύο διαφορετικές συναρτήσεις (functions) οι οποίες ενεργοποιούνται ξεχωριστά εντός του περιβάλλοντος του Apps Script. Για να τρέξουμε τον κώδικα, πρέπει αρχικά να τον έχουμε αποθηκεύσει. Έπειτα, θα πατήσουμε το «run». Εάν είναι η πρώτη φορά που τρέχουμε το συγκεκριμένο αρχείο, τότε το σύστημα θα μας οδηγήσει σε επιλογές για παροχή πρόσβασης, τις οποίες θα πρέπει να αποδεχθούμε.

Έπειτα από την εκτέλεση της συνάρτησης, τα δεδομένα εντός του υπολογιστικού φύλλου θα λάβουν την εξής μορφή: 

Στιγμιότυπο οθόνης από το υπολογιστικό φύλλο και τις εγγραφές που έγιναν μετά την εκτέλεση της συνάρτησης «updateBoxOfficeTable» στο Google Apps Script.

Τα στοιχεία έχουν ενταχθεί εντός του sheet, σε νέο φύλλο με το όνομα «Box Office». Τα δεδομένα έχουν, όμως, σφάλματα, καθώς έχουν ενταχθεί σε λάθος στήλες. Εδώ, έρχεται η δεύτερη συνάρτηση (cleanBoxOfficeTable) του συνολικού κώδικα που παρατίθεται παραπάνω.

Για να εκτελέσουμε την επόμενη συνάρτηση εντός του Apps Script, πηγαίνουμε στα δεξιά της επιλογής «Debug» και πατάμε πάνω στο όνομα της συνάρτησης. Τότε, θα ενεργοποιηθεί το dropdown μενού, στο οποίο θα διαλέξουμε τη συνάρτηση που επιθυμούμε.

Οι διαφορετικές συναρτήσεις εμφανίζονται με τη μορφή dropdown μενού.

Επιλέγουμε τη συνάρτηση «cleanBoxOfficeTable» και την εκτελούμε. Όταν ολοκληρωθεί η εκτέλεσή της και επιστρέψουμε στο υπολογιστικό φύλλο τα δεδομένα, θα είναι «ευθυγραμμισμένα» στις σωστές στήλες.

Στιγμιότυπο οθόνης από το υπολογιστικό φύλλο μετά την εκτέλεση της δεύτερης συνάρτησης του κώδικά μας.

Η αυτοματοποίηση της εκτέλεσης του script μπορεί να γίνει με δύο τρόπους: είτε με κώδικα είτε –πιο εύκολα– με τις επιλογές που παρέχει το περιβάλλον του Apps Script. Για τη δεύτερη περίπτωση, πηγαίνουμε στο σύμβολο του ξυπνητηριού στο αριστερό μέρος της σελίδας, που ονομάζεται «triggers». Εκεί, μπορούμε να επιλέξουμε να προσθέσουμε νέο trigger που θα ενεργοποιεί συγκεκριμένη συνάρτηση, ανά συγκεκριμένα χρονικά διαστήματα κλπ.

Στιγμιότυπο οθόνης από τον ορισμό trigger για την ενεργοποίηση της πρώτης συνάρτησης του κώδικα.

Καθώς το συγκεκριμένο σύνολο δεδομένων δεν ανανεώνεται τόσο συχνά, επιλέξαμε να εκτελείται ο κώδικας μία φορά την εβδομάδα, πραγματοποιώντας ουσιαστικά την χειρωνακτική εργασία που θα έκανε ένας άνθρωπος με copy-paste του πίνακα.  

Σημειωτέον, κατά τη συλλογή δεδομένων με αυτοματοποιημένη διαδικασία πρέπει να λαμβάνονται υπόψη οι άδεις που παρέχουν οι ιστοσελίδες και τα API.

Creative Commons license logo