Google Sheets et Google Apps Script : sauvegarder ses feuilles de calcul au format CSV

0
263

Si vous avez un fichier Google Sheets avec plusieurs feuilles que vous souhaitez exporter sur votre ordinateur au format CSV, cet article est fait pour vous !


Google Sheets propose l’option de téléchargement en natif, mais pour le format CSV, le téléchargement se limite à la feuille active. Il n’y a pas d’option pour télécharger d’un coup. Il n’est pas non plus possible de sauvegarder automatiquement cet export dans Drive.

Pour palier ce manque, voici un script qui sauvegarde sur votre Drive ainsi que sur votre ordinateur toutes les feuilles de votre fichier Google Sheets d’un seul coup !

Code javascript

Créez un fichier Google Sheets, ouvrez l’éditeur de script et copiez-collez ce code dans le fichier Code.gs.

function onOpen() {
  const ui = SpreadsheetApp.getUi()
      .createMenu('CSV')
      .addItem('Téléchargement CSV', 'dialog')
      .addToUi();
}

function dialog() {
  const html = HtmlService.createHtmlOutputFromFile("download").setHeight(400).setWidth(500);
  SpreadsheetApp.getUi().showModalDialog(html, 'Téléchargement CSV');  
}

function activateNextSheet(){  
  const ss = SpreadsheetApp.getActiveSpreadsheet(); 
  const sheets = ss.getSheets();
  const nbSheets = sheets.length;
  const activeSheetIndex = ss.getActiveSheet().getIndex();
  const nextActiveSheetIndex = (activeSheetIndex == nbSheets)?1:(activeSheetIndex+1);
  sheets[nextActiveSheetIndex-1].activate();
}

function downloadActiveSheet() {
  return downloadTabs(true);
}

function downloadAllTabs() {
  return downloadTabs(false);
}

function downloadTabs(isActiveSheetOnly) {
  const ss = SpreadsheetApp.getActiveSpreadsheet(); 
  const spreadsheetName = ss.getName();  
  const masterFolder = DriveApp.getFileById(ss.getId()).getParents().next();
  var folder;
  if (masterFolder.getFoldersByName(spreadsheetName).hasNext()) {
    folder = masterFolder.getFoldersByName(spreadsheetName).next();
  }
  else {
    folder = masterFolder.createFolder(spreadsheetName);
  }
  const sheets = ss.getSheets();
  const activeSheetName = ss.getActiveSheet().getName();

  var urls = [];
  for (let i=0;i<sheets.length;i++) {
    var sheet = sheets[i];
    var sheetName = sheet.getName();
    if (!isActiveSheetOnly || sheetName == activeSheetName) {
      var filename = spreadsheetName + " - " + sheetName + ".csv";
      SpreadsheetApp.getActiveSpreadsheet().toast("Génération de \""+filename+"\"");
      if (folder.getFilesByName(filename).hasNext()) {        
        folder.getFilesByName(filename).next().setName("ANCIENNE VERSION - "+filename);
      }
      var values = sheet.getDataRange().getDisplayValues();
      var csv = "";
      values.forEach(function(e){
        for (let x=0;x<e.length;x++) {
          if (e[x].indexOf(",") == -1)
            csv += e[x];
          else
            csv += "\"" + e[x] + "\"";
          if (x < (e.length -1))
            csv += ",";
          else
            csv += "\r\n";
        }
      });
      var url = folder.createFile(filename, csv, MimeType.CSV).getDownloadUrl().replace("?e=download&gd=true","");
      urls.push(url);
      if (isActiveSheetOnly)
        break;
    }
  }
  return {result: "success", message: "", urls: urls};
}

Code HTML

Créez un fichier HTML depuis l’IDE et nommez-le « download » et copiez le code HTML ci-dessous.

<!DOCTYPE html>
<style>
.banniere {
    background-color: #274F91;
    color: white;
    font-family: "Open Sans",sans-serif
    padding: 1em;
    position:fixed; 
    bottom:0px; 
    width:100%; 
    font-size:10px;
    text-align:center; 
}
a:link {
  color: white;
}
a:visited {
  color: white;
}
</style>
<html>

  <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">

  <body>
    <a href="https://thierryvanoffe.com/contact/" target="_blank"><img src="https://numericoach.fr/wp-content/uploads/2020/11/Numericoach_Logo_Horizontal.png" width="220"  ></a>
    <h2>Exporter les feuilles de votre fichier en cours au format CSV</h1>
    <form>
       
        <div style="margin-top:30px; text-align:center; ">
          
            <input class="red" type="button" id="btnDownloadAll" value="Télécharger toutes les feuilles"
              onclick="downloadAllTabs();" />
              </div>
           <div style="margin-top:30px; text-align:center; ">
            <input class="blue" type="button" id="btnDownloadThis" value="Télécharger cette feuille"
              onclick="downloadActiveSheet();" />

            <input class="blue" type="button" id="btnNextTab" value="Ouvrir feuille suivante"
              onclick="activateNextSheet();" />
          </div>
        
       <div style="margin-top:30px; text-align:center; ">
        <p class="result" id="result">&nbsp;</p>
      </div>
        <div style="margin-top:30px ">
        <input class="green" type="button" id="Close" value="Fermer" onclick="closeWindow()" /> 
      </div>
    </form>
     
    <div class="banniere">
      <a href="https://numericoach.fr/" target="_blank">Numericoach</a> - tous droits réservés - <a href="https://thierryvanoffe.com/author/christelle/" target="_blank">Christelle Legrand</a> 2021 
      | un projet ? <a href="https://thierryvanoffe.com/contact/" target="_blank">contactez-nous</a>
    </div>
  </body>
  <script>
    
    function downloadAllTabs() {
      removeResult();
      disableAllButtons(true);
      google.script.run.withSuccessHandler(showResult).downloadAllTabs();
    }

    function downloadActiveSheet() {
      removeResult();
      disableAllButtons(true);
      google.script.run.withSuccessHandler(showResult).downloadActiveSheet();
    }
    
    function activateNextSheet() {
      removeResult();
      google.script.run.withSuccessHandler().activateNextSheet();
      disableAllButtons(false);
    }

    function disableAllButtons(toDisable) {
      document.getElementById("btnDownloadAll").disabled = toDisable;
      document.getElementById("btnDownloadThis").disabled = toDisable;
      document.getElementById("btnNextTab").disabled = toDisable;
    }

    function showResult(resultDetails) {
      if (resultDetails != undefined && resultDetails != {}) {
        if (resultDetails.result == "success") {
          let currentIndex = 0;
          let files = resultDetails.urls;
          if (files.length == 1) {
            window.location.href = files[0];
            disableAllButtons(false);  
          }
          else {
            document.getElementById("Close").disabled = true;
            document.getElementById("result").innerHTML = "Téléchargement en cours - Merci de ne pas fermer la fenêtre avant que les "+files.length+" feuilles ne soient téléchargées.";
            const intervalId = setInterval(() => {
            document.getElementById("result").innerHTML = "Téléchargement feuille n°"+(currentIndex+1)+" sur "+files.length+" (prière de ne pas fermer la fenêtre).";
            if (currentIndex === files.length - 1) {
              clearInterval(intervalId);
              document.getElementById("result").innerHTML = "Téléchargement terminé (vous pouvez fermer la fenêtre).";
              disableAllButtons(false); 
              document.getElementById("Close").disabled = false;
            }
            window.location.href = files[currentIndex];
            currentIndex++;
            }, 5000);
          }
        }
        else {
          document.getElementById("result").innerHTML = resultDetails.message;
          disableAllButtons(false);  
        }
      }
      else {
        document.getElementById("result").innerHTML = "Une erreur s'est produite.";
        disableAllButtons(false);  
      }
    }

    function removeResult() {
      document.getElementById("result").innerHTML = "&nbsp;";
    }
    
    function closeWindow()
    {
      google.script.host.close();
    }   

  </script>
</html>

Remarques

Lors du premier téléchargement en masse, votre navigateur vous demandera peut-être l’autorisation de télécharger plusieurs fichiers. Si vous êtes sur Chrome, cliquez alors sur « Autoriser ». Les fois suivantes, cette question ne vous sera normalement plus posée.

Ensuite, il est impératif de ne pas fermer la fenêtre le temps de génération et de téléchargement des fichiers, car le script s’arrêterait alors en cours de route. C’est pourquoi le statut se met à jour pendant et à la fin de l’exécution pour informer l’utilisateur s’il peut ou non fermer la fenêtre.

Le bouton « Fermer » est désactivé à cet effet pendant l’exécution du script.

Et il est de nouveau utilisable une fois tous les fichiers téléchargés.

Enfin, les fichiers CSV, en plus d’être téléchargés sur votre disque dur, sont sauvegardés dans un répertoire Google Drive portant le même nom que le fichier Google Sheets. Si jamais ce dossier existe déjà il va être ré-utilisé, sinon il sera créé. De plus, s’il y existe déjà des fichiers CSV portant le même nom, ceux-ci seront préfixés par « ANCIENNE VERSION » (il est tout à fait possible de décider de les supprimer si jamais on n’a pas besoin de les conserver).


Merci d’avance pour vos commentaires et vos retours d’expérience sur ce script permettant de sauvegarder chaque onglet de votre fichier Google Sheets sous forme de fichiers CSV.

Si vous avez trouvé une faute d’orthographe, veuillez nous en informer en sélectionnant le texte en question et en appuyant sur Ctrl + Entrée .

- Accompagnement professionnel ? -Formation professionnelle et services Google Workspace

LAISSER UN COMMENTAIRE

S'il vous plaît entrez votre commentaire!
S'il vous plaît entrez votre nom ici

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.