Gestion d'ouverture et de fermeture de fichier dans Apps Script pour Sheets

Bonjour,

je me suis mise depuis peu à la programmation Apps Script. J'ai pas mal réussi à me débrouiller sauf sur ce point particulier :

ouvrir un fichier Sheets, aller sur un onglet, copier les données, les coller dans ma Sheet de travail (qui est celle qui contient le script).

J'ai le nom des sheets et les url associés. Je fais un SpreadsheetApp.openByUrl(MyUrl); mais rien ne se passe (je précise que j'ai les droits complets sur le fichier).

J'ai essayé de contourner le problème en créant un importRange , pas mieux : le contenu lié ne s'affiche que lorsque je passe à l'instruction suivante. Ce qui est trop tard puisque les autres paramètres ont été incrémentés.

Je joins le code ( je sais il y a des optimisations possibles mais j'ai dissocié le code dans mes tentatives pour essayer de trouver des solutions.)

capture d ecran 2024 09 06 173703

Bonjour,

où sont déclarés TabFichiers et TabUrl ?

Avant d'ouvrir ton fichier avec SpreadsheetApp.openByUrl(MyUrl) tu peux log MyUrl :

console.log("ouverture du nouveau fichier, url : "+MyUrl)

Ainsi, lors de l’exécution tu pourras vérifier si l'url est correcte.

PS : rapidement quelques points à vérifier /ou/ erreurs :

ligne 1, les noms de fonction par convention s'écrivent en minuscule (majuscule lorsque c'est une fonction personnalisé exportée dans G-sheet )

ligne 2, pourquoi cette ouverture { ?

ligne 4, par convention on utilise la lettre "i" pour une boucle, hormis quand la logique suppose l'utilisation d'un autre lettre / mot clé.

lignes 5 & 6, les variables par convention sont en minuscule quand déclarée dans une fonction, en majuscule quand déclarée dans la portée globale.

Bonjour,

Pour répondre à tes questions : TabFichiers et TabUrl sont des variables globales (déclarées par le code : let TabFichiers=[] ;let TabUrl=[] ;).

J'ai une fonction qui balaye mon dossier source et qui va récupérer les noms des fichiers et les URL et qui les mémorise dans la feuille shListing. J'ai déjà regardé avec un console.log , et aussi cliqué sur les url récupérées, et encore aussi copié l'url dans la barre google, à chaque fois cela ouvre parfaitement les fichiers.

Pour les conventions d'écriture, je ne maîtrise pas encore celles de Sheets (majuscules, minuscules...) . Le "l" qui te gêne à la place du "i" c'est pour une bonne lecture du code car dans les faits j'ai de nombreuses boucles , ici c'est juste un extrait du code qui ne fonctionne pas. Quand au "{" de la ligne 2, là désolée pour les conventions, mais je visualise beaucoup mieux mes ouvertures et fermetures de fonctions, if et autres boucles en mettant le "{" sur une nouvelle ligne .

Alors, concernant les convention c'est juste pour permettre une meilleur collaboration / partage des données, il n'y a rien de bloquant à ne pas les suivre, cela ne génère aucun bug donc tu fais comme il te plait

Concernant ta problématique, c'est très étonnant, si "MyUrl" est bien un url valide que ça ne marche pas, dans ce cas essayes d'une manière différente.

Si je comprends bien ton objectif, tu as dans une feuille 'shListing' en A1:A5 une liste de fichier, et en B1:B5 les urls de ces fichiers.

Tu as une seconde feuille 'MonOnglet' avec des données à archiver, sur la plage A1:N300.

Ton but est d'archiver ces données dans les fichiers listées dans la feuille 'shListing'

Si j'ai tout bon, essaye ce script :

const SHEET_LISTING = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('shListing'); // on déclare la feuille listing
const SHEET_DATA =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('MonOnglet'); // on déclare la feuille d'où provienne les données
var TAB_FICHIERS = [];

function testLienUrl() {
  var fichierEtUrl = SHEET_LISTING.getRange('A1:B5').getValues();
  TAB_FICHIERS = fichierEtUrl.map(function(row) {return [row[0], row[1]];});
  var dataToExport = SHEET_DATA.getRange('A1:N300').getValues();

  for(i=TAB_FICHIERS[0].length;i>0;i--){
    var ssArchive = SpreadsheetApp.openByUrl(TAB_FICHIERS[i][1]);
    var sheetArchive = ssArchive.getSheetByName('Feuille 1');
    sheetArchive.getRange(sheetArchive.getLastRow() + 1, 1, dataToExport.length, dataToExport[0].length).setValues(dataToExport);
  }
}

Bonjour,

Merci , et désolée pour le délai de réponse. J'ai dû changer à la marge quelques petits bouts de code, mais c'est bon !!

Je met ci-dessous le code :

var TAB_FICHIERS = [];
const shListing = spreadsheet.getSheetByName('ListeFichiers');
const sheetDest =  spreadsheet.getSheetByName("MonOngletDestination"); 

function testLienUrl() {
  var fichierEtUrl = shListing.getRange('A2:B5').getValues();
  TAB_FICHIERS = fichierEtUrl.map(function(row) {return [row[0], row[1]];});

  for(let i = TAB_FICHIERS.length; i > 0; i--)
  {
    var ssSource = SpreadsheetApp.openByUrl(TAB_FICHIERS[i-1][1]);
    var shSource = ssSource.getSheetByName('MonOngletSource');
    var dataToExport =shSource.getRange('A1:N300').getValues();

   sheetDest.getRange(sheetDest.getLastRow() + 1, 1, dataToExport.length, dataToExport[0].length).setValues(dataToExport);

  }
}

Encore merci !!

Parfait ! Voici une proposition normée et documentée pour exemple, je te conseille d'ajouter de la documentation si jamais tu es amené à retourner sur ce script ultérieurement, ou bien travailler avec d'autres personnes.

var TAB_FICHIERS = [];// Tableau pour stocker les noms de fichiers et leurs URL.
const SHEET_LISTING = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ListeFichiers'); // Feuille 'ListeFichiers' dans la feuille de calcul active.
const SHEET_DEST =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MonOngletDestination"); // Feuille 'MonOngletDestination' dans la feuille de calcul active.

/**
 * Récupère les données de fichiers externes spécifiés dans "ListeFichiers" et les colle
 * dans la feuille de destination "MonOngletDestination".
 * 
 * Processus :
 * 1. Récupère les noms des fichiers et leurs URLs à partir de la plage spécifiée dans "ListeFichiers".
 * 2. Pour chaque fichier, ouvre le fichier externe via son URL.
 * 3. Récupère les données de l'onglet source "MonOngletSource" du fichier externe.
 * 4. Colle les données dans la feuille "MonOngletDestination" à la suite des données existantes.
 */
function testLienUrl() {
  var fichierEtUrl = SHEET_LISTING.getRange('A2:B5').getValues(); // Récupère les valeurs des colonnes A et B (noms de fichiers et URL) dans la plage A2:B5 de SHEET_LISTING.
  TAB_FICHIERS = fichierEtUrl.map(function(row) {return [row[0], row[1]];});  // Pour chaque ligne récupérée, crée un tableau avec le nom du fichier et l'URL correspondante, et le stocke dans TAB_FICHIERS. (row[0] = nom, row[1] = url)
  for(let i = TAB_FICHIERS.length; i > 0; i--){  // Boucle à travers chaque fichier stocké dans TAB_FICHIERS, en partant de la fin du tableau.
    var ssSource = SpreadsheetApp.openByUrl(TAB_FICHIERS[i-1][1]); // Ouvre le fichier Google Sheets à partir de l'URL indiquée dans TAB_FICHIERS.
    var shSource = ssSource.getSheetByName('MonOngletSource'); // Récupère l'onglet 'MonOngletSource' à partir du fichier Google Sheets ouvert.
    var dataToExport = shSource.getRange('A1:N300').getValues(); // Récupère les données de la plage A1:N300 dans 'MonOngletSource'.
   SHEET_DEST.getRange(SHEET_DEST.getLastRow() + 1, 1, dataToExport.length, dataToExport[0].length).setValues(dataToExport);  // Colle les données récupérées à la suite des données existantes dans SHEET_DEST.
  }
}
Rechercher des sujets similaires à "gestion ouverture fermeture fichier apps script sheets"