Source : Google Sheets + opensheet¶
L'essentiel en 3 points
- Vos projets sont dans une feuille Google Sheets, une ligne par projet. Vous les modifiez dans le tableur, le site se met à jour sans toucher au code.
- opensheet est un petit service gratuit qui transforme une feuille partagée en JSON : une seule URL, aucune clé d'API, aucun jeton à cacher.
- La réponse est déjà un tableau d'objets, presque identique à un
projects.jsonlocal.
Pour qui?
Pour ceux qui ont un compte Google personnel. Au collège, tout le monde n'en a pas : si ce n'est pas votre cas, choisissez le JSON local ou Airtable.
1. Préparer les données¶
- Créer une nouvelle feuille dans Google Sheets.
- Renommer l'onglet du bas (par défaut « Feuille 1 ») en
Projects, sans espace ni accent. - Première ligne = noms de propriétés du format commun :
id,title,description,category,year,image,link,video,gallery. - Une ligne par projet à partir de la ligne 2.
| id | title | description | category | year | image | link | gallery |
|---|---|---|---|---|---|---|---|
| cafe-du-coin | Café du coin | Identité visuelle... | Design web | 2025 | https://... | https://... | https://...2.jpg, https://...3.jpg |
| biome | Biome | Modélisation 3D... | 3D | 2025 | https://... |
Les images doivent être des URL
Une image insérée dans une cellule (Insertion → Image) ne passe pas dans le JSON. La colonne image doit contenir du texte : soit une URL complète (https://...), soit un chemin vers une image de votre dépôt (assets/images/cafe-du-coin.jpg).
Pour la gallery, on écrit plusieurs URL dans la même cellule, séparées par des virgules. Le code de data.js les transformera en tableau.
2. Obtenir l'URL¶
Partager la feuille en lecture¶
Partager (en haut à droite) → Accès général → Tous les utilisateurs disposant du lien → rôle Lecteur.
Ce que ça veut dire
N'importe qui avec le lien peut lire la feuille. C'est normal : ce sont les mêmes informations que celles affichées publiquement sur votre portfolio. Ne mettez rien de privé dans cette feuille.
Trouver l'ID de la feuille¶
Dans l'adresse de votre feuille, l'ID est la longue chaîne entre /d/ et /edit :
https://docs.google.com/spreadsheets/d/1AbC2dEf3GhI4jKl5MnO6pQr/edit#gid=0
└── ID de la feuille ──┘
Construire l'URL opensheet¶
https://opensheet.elk.sh/ID_DE_LA_FEUILLE/Projects
Le dernier segment est le nom de l'onglet. Collez cette URL directement dans votre navigateur : vous devez voir vos projets en JSON. Si oui, la source est prête.
3. Le code de js/data.js¶
C'est le même loadProjects() que pour le JSON local (voir l'exercice « Du JSON à la carte » et la page JSON local). Deux choses changent.
1. L'adresse du fetch()¶
C'est de la configuration : gardez l'ID et le nom de l'onglet dans des constantes en haut du fichier, faciles à retrouver.
const SHEET_ID = '1AbC2dEf3GhI4jKl5MnO6pQr'; // votre ID
const SHEET_NAME = 'Projects';
// l'adresse à passer à fetch() :
`https://opensheet.elk.sh/${SHEET_ID}/${SHEET_NAME}`
2. La galerie : du texte au tableau¶
Si vous n'utilisez pas de galerie, rien à faire : la réponse est déjà dans le format commun, retournez-la telle quelle.
Sinon, dans la feuille, la galerie est un texte ("url1, url2"). Le format commun attend un tableau (["url1", "url2"]). Avant de retourner les données :
- Parcourez les lignes avec
map(), pour produire un nouveau tableau de projets. - Pour chaque ligne, recopiez toutes les colonnes avec la syntaxe de décomposition :
{ ...row }. - Remplacez
gallerypar sa version en tableau :split(',')coupe le texte à chaque virgule, ettrim()retire les espaces autour de chaque URL. - Si la cellule est vide,
gallerydoit être un tableau vide[](ternaire).
À vérifier
console.log(projects[0].gallery) doit afficher un tableau d'URL, pas un texte.
4. Pièges propres à cette source¶
- Tout arrive en texte, même les nombres :
yearvaut"2025", pas2025. Pour notre format commun, c'est correct. Si un jour vous devez trier ou calculer, convertissez avecNumber(project.year). - Les en-têtes de colonnes deviennent les noms de propriétés, caractère pour caractère.
Titleavec une majuscule outitleavec une espace à la fin donnent des propriétés différentes detitle. - Cellules vides : prévoyez que la propriété puisse être vide ou absente (ex. un projet sans
link). Le code d'affichage doit le gérer, on le voit dans la page suivante. - Délai de mise à jour : opensheet garde la réponse en cache quelques secondes. Si une modification n'apparaît pas tout de suite, attendez un peu et rechargez.
- Erreur dans la réponse : si l'URL affiche un message d'erreur plutôt que vos données, vérifiez le partage (« Tous les utilisateurs disposant du lien ») et le nom exact de l'onglet.
Un service gratuit maintenu par une seule personne
opensheet fonctionne très bien, mais il n'offre aucune garantie. Pour un portfolio scolaire, c'est un compromis raisonnable. Pour un site professionnel à long terme, gardez en tête qu'une copie en JSON local est toujours possible : Fichier → Télécharger → CSV, puis la même conversion que pour Excel (JSON local).
5. Vérifier que ça fonctionne¶
Temporairement, à la fin de data.js :
loadProjects().then(projects => console.log(projects[0].title));
Vous voyez le titre de votre premier projet dans la console? Retirez cette ligne de test et passez à l'affichage.