Créer une nouvelle feuille automatique lorsqu'une cellule est remplie

Bonjour,

Je souhaiterai savoir dans un premier temps si il était possible de créer une feuille automatiquement lorsqu'on rempli une celulle.

Je m'explique, partons de ce tableau de suivi tout simple : https://docs.google.com/spreadsheets/d/1dKmAOmtayVfs_uCk7BnU4H-JT-NzYuXS9ie1YpU05H4/edit#gid=0

Je souhaiterai dans un premier temps, pouvoir créer des liens automatique vers de nouvelle feuille à chaque fois que je rajoute un client.
Dans cet exemple, le client Apple renvoie vers une nouvelle feuille Apple, que j'ai du faire manuellement.

Je voudrais automatiser la chose, c'est à dire que pour Google, la feuille soit créé automatiquement avec le nom Google et que le lien soit également mis automatiquement.

De même pour Tesla et pareil pour tout nouveau client à ajouter...

Pour l'instant mon exemple est simple car je voudrais savoir si techniquement cela est possible. Il deviendra un peu plus complexe par la suite dans le sens où ça ne sera pas des feuilles 'vierge' mais qu'il faudra se baser sur une template précise.

Mais pour l'instant, savoir si cela est possible.

Merci beaucoup.

Bonjour,

toujours aussi créative ...

je prends ici le parti de créer les fichiers dans un dossier que je définie par son identifiant

const dossier = '18akqHAN7PSPMnG3h5HpCskQsMCv4TqCM'

function onSpeEdit(event) {
  var sheet = event.source.getActiveSheet();
  var cel = event.source.getActiveRange();
  if (sheet.getName() == 'Feuille 1' && cel.getColumn() == 1 && cel.getRow() > 1 && cel.getValue() != '') {
    var richValue = SpreadsheetApp.newRichTextValue()
      .setText(cel.getValue())
      .setLinkUrl(creerFichierDansDossier(cel.getValue()))
      .build();
    cel.setRichTextValue(richValue);
  }
}

function creerFichierDansDossier(nomFichier) {
  return DriveApp.getFileById(SpreadsheetApp.create(nomFichier).getId())
    .moveTo(DriveApp.getFolderById(dossier))
    .getUrl()
}

il faut ajouter un déclencheur

screenshot 2022 07 20 02 48 59

Toujours pareil ... j'ai essayé de 3 comptes google différent ...

capture d e cran 2022 07 20 a 14 29 33
image

Super !

J'ai réglé mon problème en créant un nouveau compte google et en me connectant avec un autre navigateur et cela à l'air de marcher.

Ce que je voudrais faire maintenant, ça serait de créer un nouveau fichier à partir d'un template au lieu de créer un nouveau document vierge.

Je m'explique, j'ai rajouté deux colonnes en plus sur le tableau : https://docs.google.com/spreadsheets/d/1SEa10mjIuuSBw5NZX57K_Q6mF4msoINwXPPyfkrGe6A/edit#gid=0

Appelons ce fichier "suivi"

Ce que je voudrais, c'est que lorsqu'on rajoute un nouveau un client, au lieu que ce soit un nouveau fichier vierge, cela parte de ce template : https://docs.google.com/spreadsheets/d/1wsGuCNnWwZQF506hGzQA73VCShNmIXEAy_Qc6I00bz0/edit#gid=0 pour créer un nouveau fichier client.

Pour information, les nouveaux fichiers sont dans ce dossier : https://bit.ly/3yNgpOA

Et qu'ensuite dans le nouveau fichier client, soit automatiquement rempli les informations de la feuille "suivi" Société Nom et Adresse dans la colonne B.

La finalité est bien entendu de tout automatiser, de la création d'une nouvelle feuille client jusqu'au remplissage des informations.

J'espère avoir été claire.

Je te remercie.

Avec quelques modifications sur le fichier de suivi, notamment l'onglet paramètres + service Sheets API à activer (j'ai prévu qu'il y ait beaucoup plus de données à transmettre !)

function onSpeEdit(event) {
  // définir déclencheur
  var sheet = event.source.getActiveSheet();
  var cel = event.source.getActiveRange();
  if (sheet.getName() == 'Feuille 1' && cel.getValue()) {

    var valeurs = sheet.getRange(cel.getRow(), 1, 1, sheet.getLastColumn()).getValues().flat()

    var param = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('parameters')
    var dossier = param.getRange('B1').getValue()
    var template = param.getRange('B2').getValue()
    var adresses = param.getRange('A4:B' + param.getLastRow()).getValues()
    var onglet = SpreadsheetApp.openById(template).getSheets()[0].getName()

    // duplication du template
    var file = DriveApp.getFileById(template).makeCopy(valeurs[0], DriveApp.getFolderById(dossier))

    // création du lien hypertexte
    var richValue = SpreadsheetApp.newRichTextValue()
      .setText(valeurs[0])
      .setLinkUrl(file.getUrl())
      .build();
    sheet.getRange(cel.getRow(), 1).setRichTextValue(richValue);

    // mise à jour des données
    // activer le service Sheets API
    const ranges = []
    const values = []
    adresses.forEach(ad => {
      ranges.push(onglet + '!' + ad[1])
      values.push(valeurs[[ad[0]-1]])
    })
    const data = ranges.map((e, i) => ({ range: e, values: [[values[i]]] }));
    Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, file.getId());

    // avertissement
    SpreadsheetApp.getActive().toast(valeurs[0] + "ok !", "Fin de duplication !", 5);
  }
}

Super !

Ça va dans la bonne direction ...

Est-il possible de garder les initulés Société - Nom - Adresse dans la colonne A et d'inscrire les données en colonne B ?

Merci.

Dans ce cas, tu changes les valeurs en colonne B de l'onglet paramètres en mettant B1, B2, B3 au lieu de ce que j'avais mis

Ah oui j'avais pas vu l'onglet ...

Mais j'ai dû faire une connerie ça n'a plus l'air de marcher ...

le fichier template n'existe plus! il faudrait que j'ajoute une alerte dans ce cas ...

Salut !

Merci beaucoup effectivement le template avait disparu ... Ça remarche à nouveau, cependant il semblerait qu'un nouveau fichier soit créé à chaque modification ce qui fait que je me retrouve avec des fichiers en double voire en triple :

Tableau : https://docs.google.com/spreadsheets/d/1SEa10mjIuuSBw5NZX57K_Q6mF4msoINwXPPyfkrGe6A/edit#gid=0

Dossier : https://bit.ly/3oqiPhz

Oui, le nom est double/triple/... mais l'identifiant est unique

Veux-tu

  • remplacer le fichier, c'est-à-dire supprimer l'ancien du même nom ?
  • ou garder l'ancien fichier et lui remettre à jour les informations ?

Garder le fichier et mettre à jour les informations, il faudrait que l'URL du fichier soit toujours le même

ok

C'est assez facile de créer des fichiers à chaque fois, mais cela se multiplie

Pour ré-écrire dans le même, il faudra alors considérer quelques cas tordus que je suis en train de voir

  1. la colonne 1 renvoie bien vers une url = ok, MAIS cette url est-elle toujours valide ? si ce fichier a été supprimé il peut se trouver dans la corbeille ou avoir été complètement effacé et dans ce dernier cas le lien est rompu
  2. la colonne 1 ne renvoie pas (encore) vers une url, MAIS un fichier du même nom existe déjà dans le dossier (une ligne a pu être supprimée, par erreur ou pas dans le fichier de suivi) ! pour éviter de dupliquer, soit je le mets à jour, soit je l'efface et je recrée

je regarde tout cela de la façon la plus simple possible

proposition à tester/triturer, après avoir fait le ménage dans le dossier !!

function onSpeEdit(e) { // définir déclencheur
  var sheet = e.source.getActiveSheet();
  var cel = e.source.getActiveRange();
  if (sheet.getName() == 'Feuille 1' && cel.getValue() == true && cel.getColumn() == sheet.getLastColumn()) {
    if (sheet.getRange(cel.getRow(), 1) != '') {
      var valeurs = sheet.getRange(cel.getRow(), 1, 1, sheet.getLastColumn()).getValues().flat()
      var param = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('parameters')
      var [dossier, template] = param.getRange('B1:B2').getValues().flat()
      var onglet = SpreadsheetApp.openById(template).getSheets()[0].getName()
      var url = rechercherUrl(sheet.getRange(cel.getRow(), 1))
      var urlSelonNom = checkFileUrl(dossier, valeurs[0])
      if (url != null && url == urlSelonNom) {
        var id = getIdFromUrl(url)
        Browser.msgBox(`Le fichier "${valeurs[0]}" existe !`)
      } else if (url != null && url != urlSelonNom && urlSelonNom != 'none') {
        Browser.msgBox(`Schmilblick ... le fichier "${valeurs[0]}" existe bien mais ne correspond pas à l'url !\nPas de mise à jour ...`)
        return
      } else if (url == null && urlSelonNom != 'none'){
        Browser.msgBox(`Schmilblick ... le fichier "${valeurs[0]}" existe déjà !\nPas de mise à jour ...`)
        return
      } else {
        var file = DriveApp.getFileById(template).makeCopy(valeurs[0], DriveApp.getFolderById(dossier))
        var id = file.getId()
        creerHyperlink(valeurs[0], file.getUrl(), sheet.getRange(cel.getRow(), 1))
        Browser.msgBox(`Le fichier "${valeurs[0]}" a été créé !`)
      }
      update(onglet, param.getRange('A4:B' + param.getLastRow()).getValues(), valeurs, id)
      Browser.msgBox('Mis à jour ok !')
    }
    cel.setValue(!cel.getValue())
  }
}
function rechercherUrl(rng) { return rng.getRichTextValue().getLinkUrl() }
function getIdFromUrl(url) { return url.match(/[-\w]{25,}/) }
function creerHyperlink(nom, url, rng) {
  rng.setRichTextValue(SpreadsheetApp.newRichTextValue().setText(nom).setLinkUrl(url).build())
}
function update(onglet, correspondances, valeurs, id) { // activer le service Sheets API
  const ranges = [], values = []
  correspondances.forEach(tab => {
    ranges.push(onglet + '!' + tab[1])
    values.push(valeurs[[tab[0] - 1]])
  })
  const data = ranges.map((e, i) => ({ range: e, values: [[values[i]]] }));
  Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, id);
}
function checkFileUrl(folderID, name) {
  var files = DriveApp.getFolderById(folderID).searchFiles(`title='${name}' and mimeType='${MimeType.GOOGLE_SHEETS}' and trashed=false`);
  var file = files.hasNext() && files.next();
  if (file) { return file.getUrl() } else { return 'none' }
}
Rechercher des sujets similaires à "creer nouvelle feuille automatique lorsqu remplie"