Macro pour copier une feuille et enregistrer sur le drive dans nv classeur

Bonjour à tous !

J'aurais besoin d'un coup de main pour écrire une macro. Y aurait-il une âme charitable pour m'aider ?

En gros, j'ai un fichier qui comprend plusieurs feuilles, et j'aimerais, à l'aide d'une macro, en sauvegarder une dans mon drive (la feuille nommée 'Facture'), dans un dossier précis de mon drive ( ID du dossier : '1WNyBdexfylgflnDeKtMcdIN-eS578dlH' ).

Le souci c'est qu'il faut que la feuille de calcul soit enregistrée en format google sheet et non pas en format xlsx (car j'ai besoin ensuite de pouvoir importer la feuille si besoin, et c'est IMPOSSIBLE d'utiliser la fonction importrange pour importer un fichier xlsx à partir du drive => ça met directement qqch comme "vous n'avez pas l'accès à ce fichier", sans même me proposer d'associer les fichiers. Après des heures de recherche sur internet, j'ai compris que c'était parce que le fichier était enregistré en format xslx et qu'il fallait le convertir en format google sheet). Donc il faut impérativement que la feuille de calcul soit enregistrée en format google sheet.

Grâce à l'aide d'un des contributeurs de ce forum (merci encore !), j'avais une macro pour enregistrer ma facture sur mon drive, mais cela l'enregistrait au format xlsx :

const doc2 = SpreadsheetApp.getActive();
const feuille2 = doc2.getSheetByName('Facture');
const docID2 = '1T5deGL55FZacFjWD-n7Cv5hu73CuMA8V1Jccwltu1i0';
const feuilleID2 = '897185388';
const dossier2 = DriveApp.getFolderById('1WNyBdexfylgflnDeKtMcdIN-eS578dlH');
const fichier2 = 'FAC_' + feuille2.getRange("G12").getValue().toString() + ".xlsx"
const url2 = 'https://docs.google.com/spreadsheets/d/' + docID2 + '/export?';
const exportOptions2 =
'exportFormat=xlsx&format=xlsx' +
'&size=A4' +
'&portrait=true' + // orientation portrait, false pour paysage
'&fitw=true' +
'&sheetnames=false&printtitle=false' + // pas de nom ni de titre à l'impression
'&pagenumbers=false&gridlines=false' + // pas de numérotation, pas de grille
'&fzr=false' + // frozen rows = pas de répétition de l'en-tête
'&gid=' + feuilleID2;
var params2 = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}};
var reponse2 = UrlFetchApp.fetch(url2 + exportOptions2, params2).getBlob();
// Sauvegarde du fichier.
dossier2.createFile(reponse2.setName(fichier2));

Sauriez vous comment modifier / réécrire la macro pour parvenir au même résultat MAIS EN FORMAT GOOGLE SHEET ?

JE VOUS REMERCIE !!!!

Lauriane

J'ai pensé a plusieurs méthodes mais je ne sais pas écrire les macros...
.

- méthode 1 : reprendre la macro et modifier le format d'enregistrement

..

- méthode 2 : écrire une nouvelle macro pour :

1- Créer un nouveau classeur dans le drive, dans le bon dossier. (ID du dossier : '1WNyBdexfylgflnDeKtMcdIN-eS578dlH')

2- renommer le nouveau classeur et l'appeler "FAC-n°du devis", sachant que le numéro de devis se trouve sur la feuille 'DEVIS' en E6

3- dupliquer la feuille 'FACTURE' dans le le nouveau classeur et supprimer la feuille de calcul vierge du nouveau classeur

.

- méthode 3 : écrire une nouvelle macro pour :

1- Dupliquer directement le fichier en entier dans le bon dossier sur le drive (ID du dossier : '1WNyBdexfylgflnDeKtMcdIN-eS578dlH')

2- Renommer le fichier ainsi dupliqué et l'appeler "FAC-n°du devis", sachant que le numéro de devis se trouve dans le fichier source sur la feuille 'DEVIS' en E6

3- Supprimer toutes les feuilles de calcul inutiles (à savoir : 'Coller-ici-devis-ISIOHM' , 'DEVIS', 'MODIFICATIONS', 'Ne-pas-toucher' )

.

Please HELP, mon responsable voudrait que je finisse mes automatisations avant jeudi, et je suis bloquée à cause de ce problème...

Merci infiniment

Bonjour,

voilà la méthode GOOGLE

Convertir des fichiers Excel en fichiers Sheets
  1. Ouvrez Drive et double-cliquez sur un fichier Excel. Un aperçu de votre fichier s'affiche.
  2. En haut, cliquez sur Ouvrir avec Google Sheets.
  3. Cliquez sur "Fichier" Enregistrer au format Google Sheets.

Bonjour,

Merci pour votre réponse !

Malheureusement ça me demanderait un temps fou à faire manuellement sur chacun des fichiers (sachant que j'en génère entre 5 et 10 par jour), c'est pourquoi j'ai besoin d'une macro qui m'enregistre directement le fichier dans un format Google sheet...

ceci correspond bien à une sauvegarde ??

// Sauvegarde du fichier.
dossier2.createFile(reponse2.setName(fichier2));

au lieu de

const fichier2 = 'FAC_' + feuille2.getRange("G12").getValue().toString() + ".xlsx"

mettre const fichier2 = 'FAC_' + feuille2.getRange("G12").getValue().toString() ;

Oui il me semble que la ligne 'dossier2.createFile(reponse2.setName(fichier2));' permet de faire la sauvegarde (mais je ne suis pas pro donc je ne pas l'affirmer avec certitude)

J'ai bien effectué la modification (remplacer la ligne 'const fichier2 = 'FAC_' + feuille2.getRange("G12").getValue().toString() + ".xlsx' par 'const fichier2 = 'FAC_' + feuille2.getRange("G12").getValue().toString() ;') et c'est toujours pareil, le fichier s'enregistre au format XSLX ... :(

Pour le moment, je suis parti sur une autre piste : créer un nouveau fichier, reste à y mettre les données

function creer(){
  nom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Devis').getRange('E6').getValue()
  Logger.log(nom)
  dossier = DriveApp.getFolderById("___________id_du_dossier______________")
  var ss = SpreadsheetApp.create("Copie Facture " + nom)
  DriveApp.getFileById(ss.getId()).moveTo(dossier);
  Logger.log(ss.getId())
}

Merci infiniment pour votre réponse ! :)

Ca ne fonctionne pas :(, j'ai un message d'erreur : "Exception: Vous n'êtes pas autorisé à appeler SpreadsheetApp.create. Autorisations requises : https://www.googleapis.com/auth/spreadsheets"

Peut-être que c'est parce que le dossier est sur un drive partagé (même si je suis propriétaire du dossier) ?

  1. Ouvrez le projet de script.
  2. À gauche, cliquez sur Paramètres du projet settings.
  3. Cochez la case Afficher le fichier manifeste "appsscript.json" dans l'éditeur .
  4. À gauche, cliquez sur Éditeur code.
  5. À gauche, cliquez sur le appsscript.jsonfichier.
  6. Localisez le champ de niveau supérieur étiqueté oauthScopes. S'il n'est pas présent, vous pouvez l'ajouter.
  7. Le oauthScopeschamp spécifie un tableau de chaînes. Pour définir les étendues utilisées par votre projet, remplacez le contenu de ce tableau par les étendues que vous souhaitez qu'il utilise. Par exemple {"oauthScopes": ["https://www.googleapis.com/auth/spreadsheets.readonly", "https://www.googleapis.com/auth/userinfo.email" }
  8. En haut, cliquez sur Enregistrer save.

voilà ce que je peux proposer dans le même genre que MICKE

//créer une feuille de calcul dans un dossier particulier via App Script
function mettrefichier(){
folder = DriveApp.getFolderById("ID#######Dossier#######") //ID du dossier
  var ss = SpreadsheetApp.create("fichier") //nom du fichier
  var temp = DriveApp.getFileById(ss.getId());
  folder.addFile(temp)
  DriveApp.getRootFolder().removeFile(temp)
}

voir aussi ceci

https://developers.google.com/apps-script/guides/services/advanced

Bonne lecture

Merci beaucoup !

J'essaye d'effectuer les manipulations que vous m'avez décrites mais j'ai vraiment du mal a trouver les choses indiquées .

  1. Ouvrez le projet de script.

Le projet du script ? J'ai ouvert l'éditeur de script, je sais pas si c'est bien ça. J'ai toutes mes macros sur la même page :

capture d ecran 2021 05 25 a 20 33 03

2- À gauche, cliquez sur Paramètres du projet settings.

J'ai beau chercher, je ne trouve pas les paramètres... Par contre dans "Fichier" j'ai "propriété du projet", peut-être que c'est ça ?

capture d ecran 2021 05 25 a 20 35 58

3- Cochez la case Afficher le fichier manifeste "appsscript.json" dans l'éditeur .

Dans "propriétés du projet", je trouve pas :

capture d ecran 2021 05 25 a 20 38 11

Dsl je suis débutante sur Google Sheet, j'ai du mal à tout comprendre.

Script

Voici la macro testée chez moi dans un dossier :

function creer(){
  var nom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Devis').getRange('E6').getValue()
  var facture = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Facture')
  var dossier = DriveApp.getFolderById("__________ID_du_dossier_____________")
  var feuille = SpreadsheetApp.create("Copie_Facture_" + nom)
  DriveApp.getFileById(feuille.getId()).moveTo(dossier);
  Logger.log(feuille.getId())
  var destination = SpreadsheetApp.openById(feuille.getId());
  facture.copyTo(destination);
  destination.deleteSheet(destination.getSheets()[0])
}

QUESTION : y a t'il des formules avec des liens avec d'autres feuilles ?

NOTA : si on exécute 2 fois ce script, il y aura 2 fichiers de même nom. En effet, pour Google Sheets, le nom est juste un attribut, c'est l'ID du fichier qui est unique.

Autorisation ...

Pour ma part, en faisant comme ceci cela fonctionne : à gauche, clique que Services et sélectionne Drive Activity API

image

Désolé, j'aurais dû le mentionner plus haut ...

https://docs.google.com/spreadsheets/d/1g3FDY7FC_umdETCfVmKt7IoILBiMPJdGs3emRokrH2A/copy : il faut bien sûr modifier l'ID du dossier

attention il existe deux éditeurs et les menus sont différents

20210526 085803 001 20210526 085850 002

OMG CA FONCTIONNE !

Mille merci !!!!!!!!!!!!!!!!!!!

COOL !

N'oublie pas de clore ce fil de discussion en cliquant sur de Gilbert ou moi-même ... et les autres fils que tu as ouverts également !

Juste une petite question : Grâce à vous, je peux (enfin!) importer mes factures dans mon fichier d'édition de facture.

Par contre, je dois systématiquement associer la facture avec le fichier d'édition pour obtenir la facture le fichier:

capture d ecran 2021 05 26 a 13 04 06

Savez-vous s'il existe un moyen d'autoriser automatiquement l'association entre les feuilles (pour éviter de le faire manuellement pour CHAQUE facture)?

Rechercher des sujets similaires à "macro copier feuille enregistrer drive classeur"