Accélérer traitement APP SCRIPT Google Sheet

à compléter avec tes données

function maj() {
  // paramètres
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const [src, dst] = ["Formulaire", "Database"];
  const rng = ['B2', 'B4', 'D4', 'F4']
  const col = [1, 3, 4, 2]
  if (rng.length != col.length) { return }

  // recherche ligne
  const str = ss.getSheetByName(src).getRange(rng[0]).getDisplayValue();
  const ids = ss.getSheetByName(dst).getRange(1,col[0],ss.getSheetByName(dst).getLastRow(),1).getDisplayValues().flat()
  let ligne = +ids.indexOf(str) + 1
  if (ligne == 0) {
    ligne = ss.getSheetByName(dst).getLastRow() + 1
  }

  // capture des données
  const rngSrc = rng.map(e => `'${src}'!${e}`);
  const values = Sheets.Spreadsheets.Values.batchGet(ss.getId(), { ranges: rngSrc })

  // injection des données
  const rngDst = col.map(c => `'${dst}'!${columnToLetter(c)}${ligne}`);
  const data = rngDst.map((e, i) => ({ range: e, values: values.valueRanges[i].values }));
  Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ss.getId());
}
function columnToLetter(column) {
  var temp, letter = '';
  while (column > 0) {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

si l'id existe, on met à jour la ligne sinon on en ajoute une

Bonjour, Super fonctionne correctement et super rapide. Par contre vous pouvez vous douter que la function recherche et la function modification ne fonctionne plus j'essaie de trouver la solution mais je peine. Je dois encore vous solliciter.

la fonction modif doit fonctionner, si l'id est connu au lieu d'ajouter une ligne le script met à jour la ligne correspondant l'id

Pour la recherche, c'est une partie de la fonction maj

function rechercher() {
  // paramètres
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const [src, dst] = ["Formulaire", "Database"];
  const rng = ['B2']
  const col = [1]
  if (rng.length != col.length) { return }

  // recherche ligne
  const str = ss.getSheetByName(src).getRange(rng[0]).getDisplayValue();
  const ids = ss.getSheetByName(dst).getRange(1,col[0],ss.getSheetByName(dst).getLastRow(),1).getDisplayValues().flat()
  let ligne = +ids.indexOf(str) + 1
  if (ligne == 0) {
    Browser.msgBox("cet identifiant n'existe pas !")
  }
}

Pour la modification ok. J'ai changé les messages à la validation.

Pour le recherche je ne m'en sors pas. J'ai comme message : (cet identifiant n'existe pas !), j'ai pourtant l'ID.

//Function to Search the record
  function rechercher() {
   // paramètres
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const [src, dst] = ["Formulaire", "Database"];
  const rng = ['B2']
  const col = [1]
  if (rng.length != col.length) { return }

  // recherche ligne
  const str = ss.getSheetByName(src).getRange(rng[0]).getDisplayValue();
  const ids = ss.getSheetByName(dst).getRange(1,col[0],ss.getSheetByName(dst).getLastRow(),1).getDisplayValues().flat()
  let ligne = +ids.indexOf(str) + 1
  if (ligne == 0) {
    Browser.msgBox("cet identifiant n'existe pas !")
  }
}

Je viens de m'apercevoir que ma function validateEntry(){ ne fonctionne plus correctement. Si j'oublie un critère il m indique bien le message comme quoi la cellule n'est pas saisie et aussitôt il m'indique nouvel enregistrement ligne et rien n'est enregistré.

https://docs.google.com/spreadsheets/d/1mUt3J0QCnjF8Mtd9hJtxQX3BidJFalkYaY8dF_odKek/edit?usp=sharing

je pense que dans ta fonction recherche, il faut mettre

const rng = ['C1']

Je viens de m'apercevoir que ma function validateEntry(){ ne fonctionne plus correctement. Si j'oublie un critère il m indique bien le message comme quoi la cellule n'est pas saisie et aussitôt il m'indique nouvel enregistrement ligne et rien n'est enregistré.

où se trouve la valeur recherchée ?

pour moi elle se trouve en B4, qui est la première donnée ici

const rng = ['B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'B10', 'B11', 'B12', 'B13', 'B14', 'B15', 'B16', 'B17', 'D4', 'D5', 'D6', 'D7', 'D8', 'D9', 'D10', 'D11', 'D12', 'D13', 'D14', 'D15', 'D16', 'D19', 'D21', 'E5', 'E11', 'E15', 'E20', 'F5', 'F11', 'F15', 'F20', 'G5', 'G11', 'H5', 'H15']

pour moi, je n'ai pas dissocié la donnée en C1 et en B4 !

Bonsoir,

Avant de poster, j'avais changer

const rng = ['C1']

Cela ne fonctionne pas.

qu'est-ce qui ne fonctionne pas ! telle qu'écrite ta fonction ne donne un avis que si elle ne trouve rien.

Si tu mets 8 c'est ok, le script s'exécute sans erreur mais ne donne rien car il n'est rien écrit dans ce cas. J'ai ajouté une information pour dire que le script avait trouvé.

Si tu mets 12

image

explique ce que tu veux faire avec cette fonction.

Bonjour. Pour cette fonction recherche est de récupérer dans Database la saisie du formulaire par le numéro de ligne en colonne 1 de Database. Cette fonction permet de modifier des éléments.

Les éléments saisie dans l'onglet formulaire :

// paramètres
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const [src, dst] = ["Formulaire", "Database"];
    const rng = ['B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'B10', 'B11', 'B12', 'B13', 'B14', 'B15', 'B16', 'B17', 'D4', 'D5', 'D6', 'D7', 'D8', 'D9', 'D10', 'D11', 'D12', 'D13', 'D14', 'D15', 'D16', 'D19', 'D21', 'E5', 'E11', 'E15', 'E20', 'F5', 'F11', 'F15', 'F20', 'G5', 'G11', 'H5', 'H15']

les éléments à récupérer dans l'onglet Database

const col = [1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 25, 28, 29, 30, 34, 35, 36, 44, 45, 46, 47, 48, 49, 51, 52, 53, 61, 66, 67, 6, 13, 21, 24, 7, 19, 22, 26, 13, 20, 14, 23] if (rng.length != col.length) { return }

Désolé si je n'ai pas était très clair.

ok, il s'agit donc de mettre à jour ce code https://forum.excel-pratique.com/sheets/accelerer-traitement-app-script-google-sheet-174193#p1081927 pour tenir compte des nouvelles colonnes, ok je regarderai.

function rechercherEtReporterValeurs() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const [dst, src] = ["Formulaire", "Database"];
  const rng = ['B2', 'B4', 'D4', 'F4']
  const col = [1, 3, 4, 2]
  if (rng.length != col.length) { return }

  // recherche ligne
  const str = ss.getSheetByName(dst).getRange('C1').getDisplayValue()
  const ids = ss.getSheetByName(src).getRange(1, col[0], ss.getSheetByName(dst).getLastRow(), 1).getDisplayValues().flat()
  let ligne = +ids.indexOf(str) + 1
  if (ligne == 0) {
    Browser.msgBox("cet identifiant n'existe pas !")
  } else {

    // capture des données
    const rngSrc = col.map(c => `'${src}'!${columnToLetter(c)}${ligne}`);
    const values = Sheets.Spreadsheets.Values.batchGet(ss.getId(), { ranges: rngSrc })

    // injection des données
    const rngDst = rng.map(e => `'${dst}'!${e}`);
    const data = rngDst.map((e, i) => ({ range: e, values: values.valueRanges[i].values }));
    Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ss.getId());

  }
}

Bonsoir,

J'ai ce message d'erreur

image

J'ai trouvé

Il manquait :

}
function columnToLetter(column) {
    var temp, letter = '';
    while (column > 0) {
      temp = (column - 1) % 26;
      letter = String.fromCharCode(temp + 65) + letter;
      column = (column - temp - 1) / 26;
    }
    return letter;
}

Fonctionne à merveille. Merci mille fois.

Il faut maintenant que je règle le problème de function validateEntry() {. Depuis tous ces changements celle-ci ne fonctionne pas correctement. J'essaie de trouver et reviens vers vous si je n'y arrive pas. Merci merci.

Bonjour,

pour function validateEntry() { : J'ai trouvé il manquait une petite } grrr. C'est fait le script fonctionne à merveille.

J'ai juste encore besoin d'un petit coup de main concernant cette function validateEntry() { : Je voudrais ajouter une condition que si B4 est un inférieur à C3 j'ai une alerte avant validation.

J'ai essayé :

if (shUserForm.getRange("'B4 =<C3'") == true) {

Ne fonctionne pas. Avez-vous une idée.

Merci

la condition devrait s'écrire

if (shUserForm.getRange("B4").getValue() < shUserForm.getRange("B4").getValue()) { ........... }

Bonsoir la fonction ok pour le critère si b4 <à c3

Par contre gros BUG. Tout fonctionne. Les enregistrements, les modification d'une ligne. J'ai entré 141 lignes. Nous pouvons faire une recherche jusqu’à la ligne 119.

de la ligne 120 à la ligne 141 quand je veux faire une recherche j'ai le message cette ligne n'existe pas. J'ai tout vérifié et je ne comprends pas

.https://docs.google.com/spreadsheets/d/1WQZSAZqRELowjfoWFHnEdiJPXtTVpFm7fziXxJTVMYE/edit?usp=sharing

Bonjour,

J'ai trouvé.

const ids = ss.getSheetByName(src).getRange(1, col[0], ss.getSheetByName(dst).getLastRow(), 1).getDisplayValues().flat()

A remplacer par :

const ids = ss.getSheetByName(src).getRange(1, col[0], ss.getSheetByName(scr).getLastRow(), 1).getDisplayValues().flat()

Merci

Rechercher des sujets similaires à "accelerer traitement app script google sheet"