Automatiser la gestion de vos tâches Google Tasks dans Google Sheets

Google Tasks est un outil puissant… mais souvent méconnu. Intégré à Gmail et Google Agenda, il permet de centraliser ses « to-do » sans installer d’application supplémentaire. Pourtant, beaucoup d’utilisateurs l’ignorent ou n’exploitent pas tout son potentiel.

Dans cet article, je vous explique :

  • ce qu’est Google Tasks,
  • pourquoi et comment l’utiliser,
  • et comment mettre en place un script Google Apps Script qui centralise vos tâches dans un Google Sheets et vous envoie un rapport quotidien par e-mail.

Qu’est-ce que Google Tasks ?

Google Tasks est l’outil de gestion des tâches intégré à Google Workspace.

On y accède directement depuis :

  • Gmail : via la barre latérale droite (icône cercle bleu avec une coche).
  • Google Agenda : où les tâches apparaissent à leur date d’échéance.
  • Application mobile Google Tasks (Android & iOS).

Fonctions principales

  • Créer rapidement une tâche avec un titre, une date et des notes.
  • Organiser les tâches en listes (par projet, par client, par contexte).
  • Marquer comme « terminée » ou laisser en attente.
  • Synchronisation sur tous vos appareils.

👉 Problème : Google Tasks reste basique. Pas de rapport, pas d’export avancé, pas de tableau de suivi.

Pourquoi connecter Google Tasks et Google Sheets ?

Un Google Sheet sert de tableau de bord :

  • Vue consolidée : toutes vos listes et toutes vos tâches dans un seul tableau.
  • Rapports automatiques : email quotidien des tâches en cours.
  • Archivage et suivi : historique de toutes vos actions.
  • Personnalisation : filtres, tris, couleurs, graphiques.

Présentation du script

J’ai développé un script Google Apps Script qui :

  • Crée un menu personnalisé « Gestion des Tâches » dans Sheets.
  • Récupère vos tâches Google Tasks via l’API officielle.
  • Alimente automatiquement un onglet Tâches dans votre tableur.
  • Génère un rapport HTML par e-mail chaque jour (8h par défaut).
  • Permet de mettre en place un déclencheur pour automatiser le tout.

Mise en place étape par étape

1. Créer un Google Spreadsheet

  • Ouvrez Google Sheets
  • Créez un nouveau fichier (par exemple nommé Gestion des Tâches)

2. Ajouter le script

  • Menu Extensions > Apps Script
  • Supprimez le contenu et collez le code ci-dessous :
/**
 * ================================================================
 * Script de Gestion des Tâches Google Tasks ↔ Google Sheets
 * ================================================================
 *
 * Description :
 * Ce script interagit avec l'API Google Tasks afin de :
 *  - Récupérer toutes les listes de tâches et leurs tâches associées.
 *  - Afficher les tâches dans une feuille de calcul Google Sheets
 *    dédiée, sous forme de tableau clair et structuré.
 *  - Générer et envoyer par e-mail un rapport quotidien listant les
 *    tâches nécessitant une action ("needsAction"), regroupées par liste.
 *  - Mettre en place un déclencheur automatisé qui exécute ces actions
 *    chaque jour à une heure définie (par défaut 8h).
 *
 * Fonctionnalités principales :
 *  - Création d’un menu personnalisé "Gestion des Tâches" dans Google Sheets :
 *      • Envoyer Rapport Quotidien
 *      • Créer Déclencheur Quotidien
 *      • Remplir Tableur avec Tâches
 *      • À propos (informations sur le développeur)
 *
 *  - Collecte des tâches via l’API Google Tasks (support de la pagination).
 *  - Filtrage des tâches nécessitant une action (exclusion des tâches terminées).
 *  - Envoi d’un e-mail formaté en HTML (via un template intégré), à
 *    l’utilisateur actif, contenant le résumé des tâches en cours.
 *  - Mise à jour automatique d’une feuille nommée "Tâches" avec les données
 *    actuelles (liste, titre, date d’échéance, notes, statut).
 *  - Gestion des déclencheurs pour éviter la duplication.
 *
 * Technologies et APIs utilisées :
 *  - Google Apps Script (V8 runtime)
 *  - Services intégrés : SpreadsheetApp, MailApp, HtmlService, ScriptApp, Session
 *  - Services avancés : Tasks (Google Tasks API)
 *
 * Pré-requis :
 *  - Activer le service avancé "Tasks API" dans Éditeur de script > Services avancés de Google.
 *  - Activer également l’API Google Tasks dans la Google Cloud Console associée au projet.
 *  - Autoriser le script à accéder à Gmail (envoi mail), aux feuilles Google Sheets et aux tâches.
 *
 * Limitations :
 *  - La mise à jour du tableur ne synchronise pas avec Google Tasks (sens unique : lecture seule).
 *  - Les statuts supportés par Google Tasks sont limités à "needsAction" et "completed".
 *  - L’e-mail est envoyé à l’utilisateur effectif du script (Session.getEffectiveUser()).
 *
 * Utilisation :
 *  1. Ouvrir le Google Spreadsheet lié au script.
 *  2. Accéder au menu "Gestion des Tâches".
 *  3. Lancer un rapport ou remplir le tableau à la demande.
 *  4. (Optionnel) Créer un déclencheur pour automatiser l’exécution quotidienne.
 *
 * Développé par :
 *  Fabrice Faucheux
 *  L’atelier informatique – https://atelier-informatique.com
 *  LinkedIn : https://www.linkedin.com/in/fabricefaucheux
 *
 * Versioning :
 *  - Création initiale : 13/04/2024
 *  - Dernière mise à jour : 04/10/2025
 *
 * ================================================================
 */

const TZ = Session.getScriptTimeZone() || 'Europe/Paris';

const onInstall = (e) => onOpen(e);

const onOpen = () => {
  SpreadsheetApp.getUi()
    .createMenu('Gestion des tâches')
    .addItem('Envoyer rapport quotidien', 'envoyerRapportQuotidien')
    .addItem('Créer déclencheur quotidien', 'creerDeclencheurQuotidien')
    .addItem('Remplir tableur avec les tâches en cours', 'remplirTableurAvecTaches')
    .addSeparator()
    .addItem('À propos', 'afficherInfosDeveloppeur')
    .addToUi();
};

const executerQuotidien = () => {
  envoyerRapportQuotidien();
  remplirTableurAvecTaches();
};

const obtenirToutesLesListesDeTaches = () => {
  const items = [];
  let pageToken;
  do {
    const res = Tasks.Tasklists.list({ maxResults: 100, pageToken: pageToken });
    if (res.items) items.push.apply(items, res.items);
    pageToken = res.nextPageToken;
  } while (pageToken);
  return items;
};

const obtenirTachesDepuisListe = (idListe) => {
  const all = [];
  let pageToken;
  do {
    const res = Tasks.Tasks.list(idListe, {
      maxResults: 100,
      showCompleted: false,
      showDeleted: false,
      showHidden: true,
      pageToken: pageToken
    });
    if (res.items) {
      res.items.forEach(function(t){ Logger.log('Tâche ' + idListe + ': ' + t.title + ' - ' + t.status); });
      all.push.apply(all, res.items);
    }
    pageToken = res.nextPageToken;
  } while (pageToken);
  return all;
};

const obtenirToutesLesTachesDeToutesLesListes = () => {
  const listes = obtenirToutesLesListesDeTaches();
  var toutes = [];
  listes.forEach(function(liste){
    var taches = obtenirTachesDepuisListe(liste.id).map(function(t){
      var clone = Object.assign({}, t);
      clone.listeNom = liste.title;
      return clone;
    });
    toutes = toutes.concat(taches);
  });
  return toutes;
};

const envoyerRapportQuotidien = () => {
  const toutes = obtenirToutesLesTachesDeToutesLesListes()
    .filter(function(t){ return t.status === 'needsAction'; })
    .sort(function(a,b){ return (new Date(a.due || 0)) - (new Date(b.due || 0)); });

  if (!toutes.length) {
    Logger.log('Aucune tâche à traiter.');
    return;
  }

  var parListe = {};
  toutes.forEach(function(t){
    if (!parListe[t.listeNom]) parListe[t.listeNom] = [];
    parListe[t.listeNom].push({
      title: t.title,
      due: formaterDate(t.due),
      notes: t.notes || 'Pas de notes'
    });
  });

  const templateHtml = HtmlService.createTemplateFromFile('Mail_Modele');
  templateHtml.data = parListe;

  const to = Session.getEffectiveUser().getEmail();
  MailApp.sendEmail({
    to: to,
    subject: '[Liste des Tâches] Résumé quotidien',
    htmlBody: templateHtml.evaluate().getContent()
  });
};

const creerDeclencheurQuotidien = () => {
  supprimerDeclencheurs('executerQuotidien');
  ScriptApp.newTrigger('executerQuotidien')
    .timeBased()
    .everyDays(1)
    .atHour(8)
    .create();
};

const supprimerDeclencheurs = (fn) => {
  ScriptApp.getProjectTriggers()
    .filter(function(t){ return t.getHandlerFunction() === fn; })
    .forEach(function(t){ ScriptApp.deleteTrigger(t); });
};

const formaterDate = (iso) => {
  if (!iso) return 'Non spécifiée';
  const d = new Date(iso);
  return new Intl.DateTimeFormat('fr-FR', { dateStyle: 'long', timeZone: TZ }).format(d);
};

const formaterDateTableur = (iso) => {
  if (!iso) return 'Non spécifiée';
  const d = new Date(iso);
  return Utilities.formatDate(d, TZ, 'dd/MM/yyyy');
};

const traduireStatut = (statut) => {
  const map = { needsAction: 'Action requise', completed: 'Complétée' };
  return (statut in map) ? map[statut] : statut;
};

const remplirTableurAvecTaches = () => {
  const toutes = obtenirToutesLesTachesDeToutesLesListes();
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sh = ss.getSheetByName('Tâches') || ss.insertSheet('Tâches');

  sh.clearContents();
  sh.setFrozenRows(1);

  const headers = ['Liste', 'Élément de travail', 'Date d’échéance', 'Notes', 'Statut'];
  sh.getRange(1,1,1,headers.length).setValues([headers]).setFontWeight('bold');

  const rows = toutes.map(function(o){
    return [
      o.listeNom || '',
      o.title || '',
      formaterDateTableur(o.due),
      o.notes || 'Pas de notes',
      traduireStatut(o.status)
    ];
  });

  if (rows.length) {
    sh.getRange(2,1,rows.length,headers.length).setValues(rows);
    sh.getRange(2,3,rows.length,1).setNumberFormat('dd/MM/yyyy');
    sh.autoResizeColumns(1, headers.length);
    sh.getRange(1,1,sh.getLastRow(),headers.length).setWrap(true);
  }
};

function afficherInfosDeveloppeur() {
  const html = `
    <html>
      <head>
        <link href="https://fonts.googleapis.com/css?family=Roboto:400,500&display=swap" rel="stylesheet">
        <style>
          body { font-family: 'Roboto', sans-serif; margin: 20px; color: #202124; }
          strong { color: #202124; }
          p { line-height: 1.6; }
          .linkedin-logo { vertical-align: middle; margin-right: 5px; }
        </style>
      </head>
      <body>
        <p>Développé par Fabrice Faucheux 
           <a href='https://atelier-informatique.com' target="_blank">L'atelier informatique</a></p>
        <p>Me retrouver sur LinkedIn 
           <a href='https://www.linkedin.com/in/fabricefaucheux' target="_blank">
             <img class="linkedin-logo" src="https://upload.wikimedia.org/wikipedia/commons/c/ca/LinkedIn_logo_initials.png" alt="LinkedIn" width="20" height="20"/>Fabrice Faucheux
           </a>
        </p>
      </body>
    </html>`;
  SpreadsheetApp.getUi()
    .showModalDialog(HtmlService.createHtmlOutput(html).setWidth(450).setHeight(120), 'À propos');
}

3. Créer le modèle HTML pour l’email

Toujours dans Apps Script :

  • Fichier > Nouveau fichier HTML
  • Nom : Mail_Modele.html
  • Collez ce code :
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <style>
      body { font-family: Arial, sans-serif; font-size:14px; color:#333; }
      table { width:100%; border-collapse:collapse; background:#fff; }
      th,td { padding:8px; border-bottom:1px solid #ddd; text-align:left; }
      th { background:#f8f8f8; }
      .footer { margin-top:30px; font-size:12px; color:#666; text-align:center; }
    </style>
  </head>
  <body>
    <p>Bonjour,</p>
    <p>Voici le résumé quotidien des tâches en cours nécessitant une action.</p>

    <? if (!data || Object.keys(data).length === 0) { ?>
      <p>Aucune tâche à afficher.</p>
    <? } else { ?>
      <? for (var liste in data) { ?>
        <h3><?!= liste ?></h3>
        <table>
          <thead>
            <tr><th>Élément</th><th>Date</th><th>Notes</th></tr>
          </thead>
          <tbody>
            <? data[liste].forEach(function(tache){ ?>
              <tr>
                <td><?!= tache.title ?></td>
                <td><?!= tache.due ?></td>
                <td><?!= tache.notes ?></td>
              </tr>
            <? }); ?>
          </tbody>
        </table>
      <? } ?>
    <? } ?>

    <div class="footer">
      Développé par <a href="https://atelier-informatique.com" target="_blank">L'atelier informatique</a> – Fabrice Faucheux
    </div>
  </body>
</html>

4. Activer l’API Google Tasks

  • Dans Apps Script > Services avancés de Google : activez Tasks API.
  • Dans la console Google Cloud liée : activez également Google Tasks API.

5. Autoriser le script

Au premier lancement, Google vous demandera l’autorisation d’accéder à :

  • vos tâches,
  • vos feuilles de calcul,
  • et MailApp pour envoyer des mails.

Exemple de résultat

Dans Sheets

Un onglet Tâches sera créé, listant :

  • Liste, Titre, Date d’échéance, Notes, Statut

Dans votre boîte mail

Chaque matin, un e-mail HTML arrive avec vos tâches regroupées par liste.

Bénéfices pour vous

  • Clarté : toutes les tâches réunies dans un tableau unique.
  • Automatisation : rapport quotidien envoyé automatiquement.
  • Flexibilité : personnalisez le tableur selon vos besoins.
  • Productivité : ne laissez plus aucune tâche vous échapper.

Conclusion

Google Tasks est un outil simple mais souvent sous-exploité. En l’intégrant à Google Sheets avec Apps Script, vous obtenez un véritable tableau de bord intelligent de vos actions quotidiennes.

💡 Ce développement montre comment un script léger peut transformer un service Google basique en un outil puissant et adapté à votre organisation.