Script Importrange

Bonjour à tous

J'ai 100 fichiers Spread Sheet contenant en case A4 du 3e onglet la formule: =query(IMPORTRANGE("https://docs.google.com/spreadsheets/d/1WrTbStzpmHXXw7bN60ZW7UX3DxUBYPrk7syG9qpnabc/edit";"page WEB salarié 2!A1:O"); "select * where Col11 contains '"&B1&"'";1)

Ce fichier récupère donc les informations dans la base de données 1 (simple fichier Spread Sheet) .

Il me faudrait un script qui remplace automatiquement dans les 100 fichiers l'adresse URL présente dans cette formule pour obtenir:

=query(IMPORTRANGE("https://docs.google.com/spreadsheets/d/1WrTbStzpmHXXw7bN60ZW7UX3DxUBYPrk7syG9qpnxyz/edit";"page WEB salarié 2!A1:O"); "select * where Col11 contains '"&B1&"'";1)

Le fichier irait donc récupérer les informations dans la base de données 2 (simple fichier Spread Sheet).

Ainsi je pourrais supprimer la base de données 1 car il ne me parait pas souhaitable de faire coexister les 2 bases de données.

Je ne sais pas si c'est possible ou trop compliqué.

Merci de votre aide si vous pouvez quelque chose.

Bonjour,

Non ce n'est pas très complexe, il faut y aller méthodiquement.

La première chose est de connaître les ID des fichiers. S'ils sont tous dans le même répertoire, c'est facile :

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);
    }
  }
}

ensuite, on peut interroger chaque fichier par openbyid et remplacer la formule

  var doc = SpreadsheetApp.openById('___id du fichier______')
  var formule = (doc.getSheets()[2].getRange('A4').getFormula())
  formule = formule.replace("abc","xyz")
  doc.getSheets()[2].getRange('A4').setFormula(formule)

je ne sais pas quand sera mis à jour le résultat de la formule, pas forcément immédiatement, mais peut-être à la prochaine ouverture. A voir ...

Merci beaucoup pour ce retour. Je commence à y croire. Je suis débutant et prudent. J'ai constitué un répertoire d'essai comportant 2 fichiers seulement et, à l'extérieur de ce répertoire, j'ai créé un fichier dans lequel j'ai inséré le script comme ceci:

capture fonction 1

Merci de me confirmer que:

- c'est bien comme ça qu'il faut faire pour la 1ere étape

- la fonction ne s'appliquera qu'au répertoire d'essai que j'ai indiqué (je crois) à la ligne 3 car je ne voudrais pas que le script s'applique à ce stade à toute les feuilles de calcul ne faisant pas partie de l'essai ( à l'extérieur du répertoire d'essai)

Avec cela en effet, tu auras dans la feuille courante, un tableau te donnant sur 4 colonnes le nom, la date, l'url et l'ID de tous les fichiers contenus dans le dossier indiqué et uniquement dans ce dossier.

Par contre, je n'avais pas fait attention en reprenant mes archives, enlèves la ligne sur le type mime, ce qui donnera

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();

      data = [ 
        fichier.getName(),
        fichier.getLastUpdated(),
        fichier.getUrl(),
        fichier.getId()
      ];
      feuille.appendRow(data);

  }
}

Si cela donne le résultat que tu souhaites en matière de liste, on pourrait directement enchaîner sur la modification des fichiers en faisant cette fois-ci

function listeFichiersUnDossier() {

  var dossier = '__id du dossier_______';

  var feuille = SpreadsheetApp.getActiveSheet();
  feuille.clear();
  feuille.appendRow(["nom", "date mise à jour", "URL", "id", "ok"]);
  var folder = DriveApp.getFolderById(dossier);
  var data = [];
  var fichiers = folder.getFiles();
  while (fichiers.hasNext()) {
    var fichier = fichiers.next();

    var doc = SpreadsheetApp.openById(fichier.getId())
    var formule = (doc.getSheets()[2].getRange('A4').getFormula())
    formule = formule.replace("abc","xyz")
    doc.getSheets()[2].getRange('A4').setFormula(formule)

    data = [ 
        fichier.getName(),
        fichier.getLastUpdated(),
        fichier.getUrl(),
        fichier.getId(),
        "ok"
      ];
    feuille.appendRow(data);

  }
}

attention au temps de script limité, je ne sais pas si les 100 fichiers pourront être traités d'u seul coup.

Bonjour

Excellent pour le script permettant la création de la liste sur 4 colonnes.

En revanche difficulté d'exécution du script si dessous pour la modif automatique:

image

En fait j'aimerais bien décomposer les 2 tâches si c'est possible:

1- lister les dossiers sur le tableau : possibilité de vérifier et de scinder le travail pour éviter le risque de temps du script que tu évoques

2- lancer le changement d'url une fois que tout est vérifié

Merci de ton aide

ok, je refais un essai demain sur u de mes répertoires avec 2 fichiers ...

je vais ajouter le type mime dans la récap des fichiers

Vérifie bien que l'ID du fichier existe (normalement oui), que c'est bien un fichier google sheets, et qu'il s'agit bien de la 3ème feuille doc.getSheets()[2]

J'ai dissocié les scripts.

Une fois la liste étable, repère en colonne F les fichiers à traiter (cela permet de le faire par vague si besoin)

J'ai inclus la gestion des erreurs, et comme tu le vois l'un des fichiers a l'erreur que tu mentionnais (j'ai volontairement mis seulement 2 feuilles dans le fichier pour générer cette erreur).

function listeFichiersUnDossier() {

  var dossier = '1xvXTyQitDLYuocY5RzRJfVPkFCQKP6qZ';

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

}

function transformer(){
  var feuille = SpreadsheetApp.getActiveSheet();
  var data = feuille.getRange(2,4,feuille.getLastRow()-1,4).getValues()
  for (var i=0;i<data.length;i++){
    if(data[i][1] == 'application/vnd.google-apps.spreadsheet' && data[i][2] != '' && data[i][3] == ''){
      try{
        var doc = SpreadsheetApp.openById(data[i][0])
        var formule = (doc.getSheets()[2].getRange('A4').getFormula())
        formule = formule.replace("abc","xyz")
        doc.getSheets()[2].getRange('A4').setFormula(formule)
        feuille.getRange('G'+(i+2)).setValue('ok')
      }
      catch(err){
        feuille.getRange('G'+(i+2)).setValue('Erreur ' + err + ' !')
      }
    }
  }
}
image

ça marche!

La difficulté provenait de la désignation de l'onglet concerné. La formule à corriger est bien dans le 2e onglet et non le 3e comme je j'avais indiqué. Désolé!

J'ai bien exécuté successivement les 2 fonctions mais je n'obtiens pas le résultat attendu:

1° function listeFichiersUnDossier()

Je n'ai rien modifié à ton script

Je n'ai rien en colonne F et G:

image

2° function transformer ()

J'ai modifié le nombre d'onglet comme précédemment. La fonction semble s'exécuter normalement mais dans les fichiers concernés la modification d'adresse n('a pas lieu

image

Désolé, j'ai dû oublier de te dire qu'il fallait cocher les fichiers que tu souhaites traiter en mettant une croix colonne F, ensuite aire tourner le script transformer.


edit

Une fois la liste étable, repère en colonne F les fichiers à traiter (cela permet de le faire par vague si besoin)

ben non, j'avais signalé qu'il fallait repérer en colonne F les fichiers à traiter, mais ce n'était peut-être pas assez explicite

Génial! ça marche!

Je n'avais effectivement pas percuté qu'il fallait mettre une croix en colonne F

Je vais conserver précieusement ce script et essayer de comprendre un peu cette formule magique

Merci beaucoup

et joyeux Noël

Rechercher des sujets similaires à "script importrange"