Les feuilles de calcul Google Drive ont été adoptées par bon nombre d’utilisateurs. Au delà de l’utilisation bureautique, vous pouvez vous en servir comme source de données pour vos projets web.

Ça ne remplace pas un vrai backend, mais a l’avantage d’être connu des utilisateur, rapide à implémenter, simple à utiliser. Pour ma part, je m’en sers assez souvent lors de création de maquette ou pour des petits projets de page n’ayant pas de backend. Adjoint à un cache front, ça fait le travail rapidement et bien.

Principe de fonctionnement

  • un fichier Google Spreadsheet est mis à disposition de vos utilisateurs et peuvent l’éditer;
  • lorsqu’ils le sauvegarde, le document est automatiquement re-publié avec les nouvelles données;
  • votre site récupère son contenu au format json;
  • vous utilisez les données dans votre code.

Comment faire

  • Créez tout d’abord un document Google Spreadsheet.
  • Publiez le document en allant dans « > Fichier > Publier sur le web »
  • Récupérez l’url du fichier publié de la forme https://docs.google.com/spreadsheets/d/[ID_DU_DOCUMENT]/pubhtml
  • Appellez l’url https://spreadsheets.google.com/feeds/list/[ID_DU_DOCUMENT]/od6/public/values?alt=json depuis votre code avec cUrl ou tout autre wrapper de ce genre (la librairie Guzzle est très bien pour ça, ou simplement curl si votre serveur le permet). Vous aurez ainsi accès à un fichier au format json, avec comme clé ce qu’il y aura dans la première ligne de votre fichier Google Drive (attention toutefois aux caractères utilisés sur cette première ligne).

Exemple de codes pour récupérer le contenu de votre fichier Google Drive

Ci-dessous 3 exemples: 2 en PHP et un en NodeJS

Exemple avec PHP Guzzle

Voici un exemple avec Guzzle qui fonctionnera donc sur toutes les plateformes mais nécessite la librairie :


$client = new Guzzle();
$response = $client->get($yourGooglePublishUrl)->send();
// On s'assure que le document est rouvé et qu'il est décodable
if( 200===$response->getStatusCode() && $globalJson=$response->json())
{
// Le contenu au format json...
die(var_dump($globalJson));
}
else {
die('Error');
}

Exemple avec PHP / cURL

Exemple un peu plus long (mais il y a plus de commentaires pour ceux qui ne connaissent pas bien cURL).


/**
* Get a Google Drive document from it's shared ID
* @param string $googleDriveId the Google Drive document ID
* @return array $json an associated array
* @exception \Exception on error
*/
function getGoogleDriveAsJson($googleDriveId) {
$url = sprintf('https://spreadsheets.google.com/feeds/list/%1$s/od6/public/values?alt=json', $googleDriveId);

$ch = curl_init();

// on souhaite que curl renvoi le contenu de la page
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// timetout à 10 secondes, car parfois Google Drive est capricieux
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);

// on passe l'url du document Google drive
curl_setopt($ch, CURLOPT_URL, $url);

// On récupère les données
$data = curl_exec($ch);
curl_close($ch);

// On vérifie si la page a bien été récupérée
if(false===$data) {
throw new \Exception('CURL ERROR');
}

// On décode le json, et on vérifie que ça s'est bien passé et qu'il y a les propriétés google drive standard
$json = json_decode($data, true);

if(null===$json || !array_key_exists('feed', $json)) {
throw new \Exception('JSON PARSING ERROR');
}

return $json;
}
// Exemple :
try {
getGoogleDriveAsJson('abcdef');
}
catch(\Exception $e) {
// à personnaliser
die($e->getMessage);
}

Exemple de service en nodeJS

A appeller avec un require tout simple pour obtenir un tableau d’ojet dont chaque propriété sera une colonne du tableau Google Spreadsheet.


var Promise = require('promise');
var request = require('request');
module.exports = {
read: function(googledrive_url) {
return new Promise(function(resolve, reject) {
return request(googledrive_url, function (error, response, body) {
if (error || response.statusCode !== 200) {
return reject(new Error('Unable to get spreadsheet'));
}
var json = JSON.parse(body);
if(!json.feed || !json.feed.entry) {
return reject(new Error('Unable to parse spreadsheet result'));
}
var results = [];
for(var j in json.feed.entry) { // Each row
var entry = json.feed.entry[j];
var resEntry = {};
for(var k in entry) { // Each column
if('gsx$'===k.substring(0, 4)) {
resEntry[k.substring(4, 1000)] = entry[k]['$t'];
}
}
results.push(resEntry);
}
return resolve(results);
});
});
}
};

Utilisation:


var spreadsheet = require('./lefichiercidessus');
spreadsheet.read('google-drive-json-url')
.then(function(rowlist) {
rowlist.forEach(function(row) {
// ...
});
});

Remarque sur la protection des données

Il faut noter que publier n’a rien à vois avec les paramètres de partage du document original. Que le document soit restreint à vous, votre entreprise, ou des contacts de votre choix, si vous publiez le document Google Drive, il sera accessible par tout le monde en lecture pour peu qu’ils connaissent l’url.