[Script] Copier une feuille d'un fichier a un autre sans ID

Bonjour,

Comment copier une feuille d'un fichier google sheet aun autre sans inscrire le code ci-dessous:

var source = SpreadsheetApp.openById("***");
var target = SpreadsheetApp.openById("***");

Mais en passant par le nom des fichiers et non pas l'id des fichiers car ces fichiers seront tous les jours remplacer par des nouveau mais ils garderont les memes noms.

Merci

Jack

Bonjour,

est-ce que les anciens fichiers resteront ? car pour le drive, plusieurs fichiers peuvent comporter le même nom, il faudra alors balayer tout le drive (c'est un poil long) et récupérer le dernier selon sa date de mise à jour. C 'est en effet l'ID qui distingue les fichiers.

si les fichiers sont toujours mis dans un même dossier, alors on peut plus rapidement les lister

function listeFichiersUnDossier() {

  var dossier = 'id du dossier';

  var feuille = SpreadsheetApp.getActiveSheet();
  feuille.clear();
  feuille.appendRow(["nom", "date mise à jour", "URL", "id"]);
  var folder = DriveApp.getFolderById(dossier);
  var data = [];
  var fichiers = folder.getFiles();
  while (fichiers.hasNext()) {
    var fichier = fichiers.next();
    if (fichier.getMimeType() == 'text/csv'){
      data = [ 
        fichier.getName(),
        fichier.getLastUpdated(),
        fichier.getUrl(),
        fichier.getId()
      ];
    feuille.appendRow(data);
    }
  }
}

tu peux alors partir de ce script en testant le nom du fichier et en recherchant la date la plus récente

Bonjour,

Les anciens fichiers seront tous les jours supprimes.

As tu un code pour copier une feuille d'un fichier vers un autre? en passant par les noms des fichiers et non l'id.

Merci

Jack

ok, cela simplifie ... je regarde cela

exemple, en reprenant un ancien post

function test() {
  // D25 vers B7 et D54 vers B8
  var source = SpreadsheetApp.openById(getFileId("mon fichier source")).getSheets()[0]
  var dest = SpreadsheetApp.openById(getFileId("mon fichier de destination")).getSheets()[0]

  data = ['D25-B7', 'D54-B8']

  data.forEach(function (donnee) {
    dest.getRange(donnee.split('-')[1]).setValue(source.getRange(donnee.split('-')[0]).getValue());
  })
};

function getFileId(nomDuFicherRecherche) {
  var files = DriveApp.getFilesByName(nomDuFicherRecherche);
  while (files.hasNext()) {
    var file = files.next();
    return (file.getId())
  }
}

Je voudrais copier une feuille entiere et non pas des cellules.

Je crois que ton script copie seulement des Range.

ok

en fait j'ai surtout travaillé ici le fait de se passer de l'ID

pour la copie, c'est une nouvelle feuille dans un fichier existant ou un nouveau fichier ?

Pour la copie c'est dans un fichier existant qui ne changera pas.

Merci

À mettre dans le fichier de destination pour un import quotidien

function importerDataNouvelleFeuille() {
  var dest = SpreadsheetApp.getActiveSpreadsheet().insertSheet()
  var d = 'info du '+Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyy-MM-dd"); // à adapter
  dest.setName(d) // peut bloquer si déjà réalisé
  var ss = SpreadsheetApp.openById(getFileId('nom du fichier'))
  var sh = ss.getSheetByName('nom de la feuille')
  var values = sh.getDataRange().getValues()
  dest.getRange(dest.getLastRow()+1,1,values.length,values[0].length).setValues(values)
};
function getFileId(nomDuFicherRecherche) {
  var files = DriveApp.getFilesByName(nomDuFicherRecherche);
  while (files.hasNext()) {
    var file = files.next();
    return (file.getId())
  }
}

tu peux mettre un trigger quotidien sur la fonction

importerDataNouvelleFeuille

Bonjour,

ca marche avec des fichiers sheet.

maintenant si je veux importer une feuille d un fichier xlsx sur google drive ca ne marche pas.

function importerDataNouvelleFeuille1() {
  var dest = SpreadsheetApp.getActiveSpreadsheet().insertSheet()
  var d = '1'
  dest.setName(d) // peut bloquer si déjà réalisé
  var ss = SpreadsheetApp.openById(getFileId1('EE.xlsx'))
  var sh = ss.getSheetByName('A')
  var values = sh.getDataRange().getValues()
  dest.getRange(dest.getLastRow()+1,1,values.length,values[0].length).setValues(values)
};
function getFileId1(nomDuFicherRecherche) {
  var files = DriveApp.getFilesByName(nomDuFicherRecherche);
  while (files.hasNext()) {
    var file = files.next();
    return (file.getId())
  }
}

voila l erreur

13:47:26    Avis    Exécution démarrée
13:47:28    Erreur    
Exception: Service Spreadsheets failed while accessing document with id 1eB8oeA6lcVsl49zNBAS2IHWxQrscq8SN.
importerDataNouvelleFeuille1    @ Code.gs:24

Comment faire s il te plait?
En plus je dois importer 4 feuilles de 4 fichiers differents .xlsx a la suite si tu as un code stp

une feuille par fichier xlsx.

Jack

Bonjour,

Bonjour,

ca marche avec des fichiers sheet.

maintenant si je veux importer une feuille d un fichier xlsx sur google drive ca ne marche pas.

oui, c'est normal que cela ne marche pas ! et puis c'était la spécification initiale


pour les fichiers xlsx, je ne me lancerais pas dans une exploration et un test assez long ... voici juste un script d'import d'un fichier complet par script, en langue shakespearienne !, ensuite tu enchaînes avec le code précédent.

function onOpen() {
  SpreadsheetApp.getUi().createMenu("Import Excel file")
    .addItem("Import Excel file from Drive", "main")
    .addToUi();
}

function main() {
  let fileName = promptUser("Enter the name of the Excel file to import:");
  if(fileName === null) {
    toast("Please enter a valid filename.");
    return;
  }
  let sheetName = promptUser(`Enter the name of the sheet in ${fileName} to import:`);
  if(sheetName === null) {
    toast("Please enter a valid sheet.");
    return;
  }
  toast(`Importing ${sheetName} from ${fileName} ...`);
  let spreadsheetId = convertExcelToGoogleSheets(fileName);
  let importedSheetName = importDataFromSpreadsheet(spreadsheetId, sheetName);
  toast(`Successfully imported data from ${sheetName} in ${fileName} to ${importedSheetName}`);
}

function toast(message) {
  SpreadsheetApp.getActive().toast(message);
}

function promptUser(message) {
  let ui = SpreadsheetApp.getUi();
  let response = ui.prompt(message);
  if(response != null && response.getSelectedButton() === ui.Button.OK) {
    return response.getResponseText();
  } else {
    return null;
  }
}

function convertExcelToGoogleSheets(fileName) {
  let files = DriveApp.getFilesByName(fileName);
  let excelFile = null;
  if(files.hasNext())
    excelFile = files.next();
  else
    return null;
  let blob = excelFile.getBlob();
  let config = {
    title: "[Google Sheets] " + excelFile.getName(),
    parents: [{id: excelFile.getParents().next().getId()}],
    mimeType: MimeType.GOOGLE_SHEETS
  };
  let spreadsheet = Drive.Files.insert(config, blob);
  return spreadsheet.id;
}

function importDataFromSpreadsheet(spreadsheetId, sheetName) {
  let spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  let currentSpreadsheet = SpreadsheetApp.getActive();
  let newSheet = currentSpreadsheet.insertSheet();
  let dataToImport = spreadsheet.getSheetByName(sheetName).getDataRange();
  let range = newSheet.getRange(1,1,dataToImport.getNumRows(), dataToImport.getNumColumns());
  range.setValues(dataToImport.getValues());
  return newSheet.getName();
}

Je copie le code dans quel fichier? Et je lance quel script en 1er? OnOpen?

il est censé faire quoi ce long code?

sinon pour faire plus facile si je pouvais dans un fichier Google sheet nommé "importe" avoir un code qui va importer juste les 4 groupes de cellules des 4 fichiers xlsx en faisant un copier coller des données sur les feuilles 1, 2, 3 et 4 du fichier "importe".

Peux tu faire un code pour cela?

merci.pour ton aide précieuse.

Je copie le code dans quel fichier? Et je lance quel script en 1er? OnOpen?

il est censé faire quoi ce long code?

fais un essai, mais comme je disais, je ne me lancerai pas dans une exploration et un test assez long, c'est juste un import du web

Je copie le code dans quel fichier? Et je lance quel script en 1er? OnOpen?

il est censé faire quoi ce long code?

sinon pour faire plus facile si je pouvais dans un fichier Google sheet nommé "importe" avoir un code qui va importer juste les 4 groupes de cellules des 4 fichiers xlsx en faisant un copier coller des données sur les feuilles 1, 2, 3 et 4 du fichier "importe".

Peux tu faire un code pour cela?

poste un nouveau sujet, mais je ne me lacerai pas personnellement là dedans, je ne souhaite pas travailler sur les passerelles excel-GSheets

faut il changer des parties du code? Comme le nom des fichiers ou autres?

as-tu essayé ? message d'erreur ?

a priori tout est en anglais, le programme demandera le nom complet du fichier (sous drive) et le nom de l'onglet

il faut par contre activer le service google drive api (à gauche dans l'éditeur de script, il y la rubrique services)

Ça marche oui.

J'ai trouvé mieux sur Google:

function importXLS(){
  var files = DriveApp.getFolderById('1hjvNIPgKhp2ZKIC7K2kxvJjfIeEYw4BP').searchFiles('title != "nothing"');
  while(files.hasNext()){
    var xFile = files.next();
    var name = xFile.getName();
    if (name.indexOf('.xlsx')>-1){ 
      var ID = xFile.getId();
      var xBlob = xFile.getBlob();
      var newFile = { title : name+'_converted',
                     key : ID
                    }
      file = Drive.Files.insert(newFile, xBlob, {
        convert: true
      });
    }
  }
}

intéressant !

Rechercher des sujets similaires à "script copier feuille fichier"