Sauvegarde automatique d'une feuille Gsheet en .ods ou autre format

Bonjour,

Gsheet est un super outil fluide et collaboratif mais il y a peu j'ai fait les frais d'une mauvaise manip sur mon GG drive et j ai perdu un tas de données.

Entre-temps j'ai mis en place une synchronisation automatique entre mon drive et mon PC, mais il n'empêche que les "fichiers locaux" .gsheet ne sont en fait que des liens vers la feuille en ligne. J'aimerais remédier à cela et faire en sorte que régulièrement, le fichier gsheet soit automatiquement copié dans un format "physique" (.ods dans mon cas), dans le même dossier que le fichier gsheet.

Bien sûr c'est faisable manuellement via le menu "Fichier" de gsheet mais bon... manuellement.

Connaissez vous un moyen d'y arriver ? Sachant que je n'ai pas de connaissance en scripts ou autre programmation...

Merci beaucoup !

Bonjour,

Enregistrer ce script et ajouter un déclencheur quotidien, hebdomadaire, comme vous voulez :

function exportSheetToDrive() {
  var fileId = "ID fichier sheets";
  var sheet = SpreadsheetApp.openById(fileId);
  var blob = sheet.getBlob().getBytes();
  var drive = DriveApp.getRootFolder();
  var fileName = sheet.getName();
  var chrono = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd-MM-yyyy_HH-mm-ss");
  var exportFileName = fileName + "_" + chrono + ".xlsx";
  var newFile = DriveApp.createFile(blob).setName(exportFileName);
  drive.createFolder('Exported Sheets').addFile(newFile);
  DriveApp.getFileById(newFile.getId()).moveTo(drive);
  DriveApp.getFileById(newFile.getId()).setTrashed(true);
}

Bonjour et merci pour votre aide !

Je viens de tester ce script et apparemment il y a un souci. En cherchant j'ai cru comprendre que Google aurait désactivé la fonction SpreadsheetApp.openById

Exception: Unexpected error while getting the method or property openById on object SpreadsheetApp.
exportSheetToDrive    @ Code.gs:3

Ca vous dit quelque chose ?

En effet ca ne foncitonne pas, voici un script qui fait une copie au format sheet :

function exportSheetToDrive() {
  var fileId = "15JMH4gcDPCKY6uuMERZ3nxVjgqctgg4RBGYoOJU6Jqg"; // ID du fichier sheet
  var foldId = "1KWz17UvzXXhXDWXQJinbDvVgj2uOFBF3"; // ID du dossier drive
  var originalSheet = SpreadsheetApp.openById(fileId);
  var originalData = originalSheet.getDataRange().getValues();
  var now = new Date();
  var chrono = Utilities.formatDate(now, Session.getScriptTimeZone(), "dd-MM-yyyy_HH-mm-ss");
  var newSpreadsheet = SpreadsheetApp.create("Copie_" + originalSheet.getName() + "_" + chrono, originalData.length, originalData[0].length);
  var newSheet = newSpreadsheet.getActiveSheet();
  newSheet.getRange(1, 1, originalData.length, originalData[0].length).setValues(originalData);
  DriveApp.getFileById(newSpreadsheet.getId()).moveTo(DriveApp.getFolderById(foldId));
}

Et voici le même script qui fait l'export en CSV :

function exportSheetToDrive() {
  var fileId = "15JMH4gcDPCKY6uuMERZ3nxVjgqctgg4RBGYoOJU6Jqg"; // ID du fichier sheet
  var foldId = "1KWz17UvzXXhXDWXQJinbDvVgj2uOFBF3"; // ID du dossier drive
  var originalSheet = SpreadsheetApp.openById(fileId);
  var originalData = originalSheet.getDataRange().getValues();
  var now = new Date();
  var chrono = Utilities.formatDate(now, Session.getScriptTimeZone(), "dd-MM-yyyy_HH-mm-ss");
  var csvContent = "";
  for (var i = 0; i < originalData.length; i++) {
    csvContent += originalData[i].join(",") + "\n";
  }
  var fileName = "Copie_" + originalSheet.getName() + "_" + chrono + ".csv";
  var file = DriveApp.createFile(fileName, csvContent);
  file.moveTo(DriveApp.getFolderById(foldId));
}

Ah là oui ça marche !

J'ai tenté quelques bricolages notamment pour passer en .ods et pour ne pas ajouter la date de la sauvegarde mais plutôt "écraser" le fichier précédent (je n'ai pas d'intérêt à conserver l'historique). Pour l'instant ça ne fonctionne pas au top mais c'est déjà pas mal ! Je pense que le nouveau fichier est créé avant que l'ancien ne soit déplacé dans la corbeille, donc il s'incrémente.

Merci encore, en tout cas ça donne bien envie d'apprendre à utiliser ces scripts.

function exportSheetToDrive() {
  var fileId = "..."; // ID du fichier sheet
  var foldId = "..."; // ID du dossier drive
  var originalSheet = SpreadsheetApp.openById(fileId);
  var originalData = originalSheet.getDataRange().getValues();
  var odsContent = "";
  for (var i = 0; i < originalData.length; i++) {
    odsContent += originalData[i].join(",") + "\n";
  }
  var fileName = originalSheet.getName() + ".ods";
  var deleteOld = DriveApp.getFilesByName(fileName).next().setTrashed(true);
  var file = DriveApp.createFile(fileName, odsContent);
  file.moveTo(DriveApp.getFolderById(foldId));
}

Bonjour,

à tester :

function exportSheetToDrive() {
  var fileId = ""; // ID du fichier sheet
  var foldId = ""; // ID du dossier drive
  var originalSheet = SpreadsheetApp.openById(fileId);
  var originalData = originalSheet.getDataRange().getValues();
  var now = new Date();
  var chrono = Utilities.formatDate(now, Session.getScriptTimeZone(), "dd-MM-yyyy_HH-mm-ss");
  var ods = "";
  for (var i = 0; i < originalData.length; i++) {
    ods += originalData[i].join("\t") + "\n";
  }
  var fileName = "Copie_" + originalSheet.getName() + "_" + chrono + ".ods";
  var fileBlob = Utilities.newBlob(ods, MimeType.ODS, fileName);
  var folder = DriveApp.getFolderById(foldId);
  var file = folder.createFile(fileBlob);
}

Bonjour !

Alors je me suis lancé dans un autre test en utilisant file.makeCopy ; imbriqué dans une boucle qui est sensée balayer tous les fichiers Sheets de mon Drive car en fait je veux tous les copier, et en xlsx finalement.

Mais ça ne marche pas. Pouvez-vous me dire ce que vous en pensez ?

Le message d'erreur est :

Exception: Cannot retrieve the next object: iterator has reached the end.

copySheetToExcel @ Code.gs:14

function copySheetToExcel() {

// Récupérer tous les fichiers GgSheets du Drive
  var files = DriveApp.getFilesByType("application/vnd.google-apps.spreadsheet");

// Boucle pour traiter tous ces fichiers
while (files.hasNext()) {
  var file = files.next();

// Définir nom de fichier
  var fileName = file.getName();

// Supprimer fichier .xlsx existant avec ce nom
  var deleteOld = DriveApp.getFilesByName(fileName + ".xlsx").next().setTrashed(true);

// Créer une copie avec extension .xlsx
  var newFile = file.makeCopy(fileName + ".xlsx");

}
}

Si ça ne fonctionne pas je réessaierai en passant par un blob..

Merci encore !

Bonjour,

Si je comprends bien, tu itères sur les fichiers Sheets de ton Drive, puis, tu prends chaque nom de fichier et tu supprime sa version .xlsx (j'ajouterai une vérification si le fichier existe), ensuite, tu créer une copie du fichier Sheets en xlsx.

Tu peux vérifier avec une simple condition if :

   var deleteOld = DriveApp.getFilesByName(fileName + ".xlsx");
    if (deleteOld.hasNext()) {
      deleteOld.next().setTrashed(true);
    }

Ou avec try / catch :

 try {
      var deleteOld = DriveApp.getFilesByName(fileName + ".xlsx").next();
      deleteOld.setTrashed(true);
    } catch (e) {
      console.log("Le fichier xlsx :  " + fileName+" est introuvable dans le Drive");
    }

Il semble que l'erreur se produise parce que vous essayez d'obtenir le prochain fichier même lorsque la boucle a atteint la fin de la liste des fichiers. Pour éviter cela, vous pouvez vérifier si files.hasNext() est vrai avant de continuer à obtenir le prochain fichier.

function copySheetToExcel() {
  // Récupérer tous les fichiers GgSheets du Drive
  var files = DriveApp.getFilesByType("application/vnd.google-apps.spreadsheet");

  // Boucle pour traiter tous ces fichiers
  while (files.hasNext()) {
    var file = files.next();

    // Définir nom de fichier
    var fileName = file.getName();

    // Vérifier s'il existe un fichier .xlsx avec ce nom
    var existingFiles = DriveApp.getFilesByName(fileName + ".xlsx");
    if (existingFiles.hasNext()) {
      // S'il existe, le supprimer
      existingFiles.next().setTrashed(true);
    }

    // Créer une copie avec extension .xlsx
    file.makeCopy(fileName + ".xlsx");
  }
}

Cdlt

Alex

Bonjour et merci encore pour votre aide !

Voilà le script est enfin fonctionnel ! Le voilà.

Donc il permet de maintenir à jour (à intervalles déterminés par le déclencheur) une copie Excel de chaque fichier Sheets présent sur le drive , dans le même dossier que celui-ci.

function copySheetToExcel() {

// Récupérer tous les fichiers GgSheets du Drive
  var files = DriveApp.getFilesByType("application/vnd.google-apps.spreadsheet");

// Boucle pour traiter tous ces fichiers
while (files.hasNext()) {
  var file = files.next();

//Obtenir export du fichier en xlsx
  var fileId = file.getId();
  var url = "https://docs.google.com/spreadsheets/d/"+fileId+"/export";
  var blob = UrlFetchApp.fetch(url, {headers: {authorization: `Bearer ${ScriptApp.getOAuthToken()}`}}).getBlob();

// Vérifier si fichier .xlsx existant, si oui le supprimer
  var oldFile = DriveApp.getFilesByName(file.getName() + ".xlsx")
  if (oldFile.hasNext()) {
    oldFile.next().setTrashed(true)
  }

// Obtenir le dossier contenant le fichier d'origine
  var fileParents = file.getParents();
   while (fileParents.hasNext()) {
   var folder = fileParents.next();
   }

// Créer nouveau fichier .xlsx
  var newFile = folder.createFile(blob.setName(file.getName()+".xlsx"));

}
}

Merci pour ce retour et bravo !

Rechercher des sujets similaires à "sauvegarde automatique feuille gsheet ods format"