It’s a trap! Feilen i Google spreadsheet som kan felle deg

Til tross for at Google er ubehagelig nære venner med NSA, så er de en viktig brikke i datajournalistikken til de fleste aviser. Google Spreadsheet har sakte og sikkert vokst seg frem til å være den mest brukte datakilden for datavisualiseringer.
Problemet er at det har Google har gjort noen endringer som har fått negative konsekvenser.

IT’S A TRAP: Det er strengt tatt en bug, men overskriften gjør at jeg kan bruke Admiral Ackbar som illustrasjon. ILLUSTRASJON: TheGreatBrandino på DevianArt

Hvis du har en google-sesjon som har gått ut, krever nå Google at du logger på igjen for å se regnearket. Til og med de som er public. (les feilmeldingen her). Dette er totalkrise siden våre lesere ikke ser hva som skjer bak visualiseringen. De får bare ingenting opp og blir irriterte.

Det finnes heldigvis en løsning. For problemet skjer kun med sesjoner som utløpt. Om du aldri har logget det på så vil problemet aldri dukke opp. Dette kan vi utnytte. Det gjør at vi kan lage en proxy, eller en mellomtjener om du vil, som henter ned dataene våre. Ikke få panikk! Denne gangen er «proxy» bare en skummel måte å si php-fil på.

Rob Flathery har snekret sammen en php-kode som gjør akkurat dette for deg. Bare vær obs på at url-en som brukes har endret seg litt siden denne ble skrevet. Man kunne selvsagt hentet ned json direkte fra spreadsheetet, men denne koden har jeg brukt før og da var det for å enkelt å gjenbruke.

En smart liten endring kan være å ta høyde for at Google Spreadsheet er nede. Derfor har jeg skrevet om scriptet til å kun laste ned innholdet hvert femte minutt og ellers hente fra flatfilen.

Det ryktes at en fiks er på vei, men det kan uansett være lurt å gå over til denne metoden for å ta høyde for stabilitetsproblemer og annen galskap.

</pre>
/*
 * Downloads a Google Spreadsheet in CSV and converts it to JSON
 * Saves the data to file if the current file is older than five minutes
 * Use the parameter jsonCallback for jsonp
 * Modified version of Rob Flathery's code: http://www.ravelrumba.com/blog/json-google-spreadsheets/
 */

// Function to convert CSV into associative array
function csvToArray($file, $delimiter)
{
 $arr = array();
 try {
 if (($handle = fopen($file, 'r')) !== FALSE) {
 $i = 0;
 while (($lineArray = fgetcsv($handle, 4000, $delimiter, '"')) !== FALSE) {
 for ($j = 0; $j < count($lineArray); $j++) {
 $arr[$i][$j] = $lineArray[$j];
 }
 $i++;
 }
 fclose($handle);
 }
 }
 catch (Exception $exception) {
 // Write to log
 }
 return $arr;
}
// Location of file on server
$file = realpath(dirname(__FILE__)) . "/data/data.json";
// Check if the file exists on the server. And if so, is it older than five minutes
if (!file_exists($file) || time() - filemtime($file) > 5 * 60) {
 // Set the key to your spreadsheet
 $spreadsheetKey = "";
 $feed = "https://docs.google.com/spreadsheet/pub?key=" . $spreadsheetKey . "&output=csv";

 $jsonCallback = $_REQUEST['jsonCallback'];

 // Arrays we'll use later
 $keys = array();
 $newArray = array();

 // Do it
 $data = csvToArray($feed, ",");

 if (!empty($data)) {
 // Set number of elements (minus 1 because we shift off the first row)
 $count = count($data) - 1;

 //Use first row for names
 $labels = array_shift($data);

 foreach ($labels as $label) {
 $keys[] = $label;
 }

 // Add Ids, just in case we want them later
 $keys[] = "id";

 for ($i = 0; $i < $count; $i++) {
 $data[$i][] = $i;
 }

 // Bring it all together
 for ($j = 0; $j < $count; $j++) {
 $d = array_combine($keys, $data[$j]);
 $newArray[$j] = $d;
 }
 // encode to JSON
 $data = json_encode($newArray);
 // Save the data to the server
 $handle = fopen($file, 'w');
 fwrite($handle, $data);
 fclose($handle);
 } else {
 $data = readfile($file);
 } // output the data
 echo $jsonCallback . "(" . $data . ")";
} else {
 // output the data
 echo $jsonCallback . "(";
 readfile($file);
 echo ")";
}

<span style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px;">