Variable globale avec Onedit(e)

Bonjour à tous !

Je reviens avec un petit soucis. À partir d'une modification (cochage de checkbox), j'ouvre un formulaire. Je souhaiterai le remplir, et lors de la validation, rentrer les données inscrites dans la ligne que j'ai modifiée.

Pour cela, je souhaite donc récupérer le n° de la ligne à l'aide d'une variable globale dans une autre fonction qu'OnEdit(e). Mais je n'y arrive pas, j'ai peut-être mal compris la notion de variable globale.
J'ai essayé avec une méthode différente, j'arrive à récupérer le n° de la ligne dans une MsgBox (dans l'autre fonction) mais je n'arrive pas à insérer les données dans la feuille.

Voici mon document. Où est-ce que je pêche ?

Merci de votre aide et bonne journée !

Baboutz

joli mon cher Baboutz

    <input type="text" name="Date" placeholder="dd/mm/yyyy" onkeyup="
  var date = this.value;
  if (date.match(/^\d{2}$/) !== null) {
     this.value = date + '/';
  } else if (date.match(/^\d{2}\/\d{2}$/) !== null) {
     this.value = date + '/20';
  }" maxlength="10">

je reconnais là l'une de tes préoccupations sur excel !

tu dois pouvoir transmettre cette valeur dans un input type="hidden" du formulaire html et la récupérer lors de la validation.

https://developer.mozilla.org/fr/docs/Web/HTML/Element/Input/hidden

Dans ton code gs, ajoute evaluate()

// Boîte de dialogue
function formulaireAjoutBD() {
  var html = HtmlService
    .createTemplateFromFile("AjoutBD")
    .evaluate();
  html
    .setWidth(300)
    .setHeight(250);
  SpreadsheetApp.getUi().showModalDialog(html, 'Ajouter une BD');
}

et ajoute une fonction

function getLigne(){
  return SpreadsheetApp.getActiveSheet().getActiveRange().getRow();
}

dans le code html

    <? var ligne = getLigne(); ?>
    <input type="hidden" name="ligne" value="<?= ligne ?>">

et tu as dans ton formulaire la ligne courante sélectionnée, ou autre chose comme tu le souhaites

passe le de type="hidden" à type="text" le temps de voir dans le formulaire la valeur passée de gs à html

nota : je reconnais que ton idée de variable globale est intéressante mais je ne l'ai jamais testée dans google sheets ! j'utilise ici plutôt une méthode couramment utilisée dans les pages web

Alors cher Baboutz, c'est bon ?

Bonjour Mikhail,

Désolé, we chargé !

Je viens tout de même de tester mais :

  1. Premier soucis, l'evaluate() ne m'ouvre plus le formulaire au clique d'une checkbox.
  2. Lorsque j'enlève l'evaluate(), et que je met l'input normalement hidden en type text, cela m'affiche :
    image

Mais je me doute ça m'affiche ça à cause du manque de l'évaluate ?


Voici mon code gs :

// Boîte de dialogue
function formulaireAjoutBD() {
  const html = HtmlService
    .createHtmlOutputFromFile('AjoutBD')
    .evaluate();
  html
    .setWidth(300)
    .setHeight(250);
  SpreadsheetApp.getUi().showModalDialog(html, 'Ajouter une BD');
}

function getLigne(){
  return SpreadsheetApp.getActiveSheet().getActiveRange().getRow();
}

Et mon code HTML :

    <p>Offert par</p>
    <input type="text" name="offert" value="">
    <p>Date</p>
    <input type="text" name="Date" placeholder="dd/mm/yyyy" onkeyup="
  var date = this.value;
  if (date.match(/^\d{2}$/) !== null) {
     this.value = date + '/';
  } else if (date.match(/^\d{2}\/\d{2}$/) !== null) {
     this.value = date + '/20';
  }" maxlength="10">
    <? var ligne = getLigne(); ?>
    <input type="text" name="hidden" value="<?= ligne ?>">
    <input type="button" value="Ajouter" onclick="ajouter()">
    <span class="annuler" onclick="google.script.host.close()">Annuler</span>

J'ai également tenté la ligne <? var ligne = getLigne(); ?> entre les balises <script> mais nada...


je reconnais là l'une de tes préoccupations sur excel !

Ahah et oui, j'aime bien ça ! Et encore, là c'est un code que j'ai trouvé sur le net et que j'ai adapté. Je compte le retravailler un peu mais il faut que je maîtrise un peu mieux le javascript !

Merci encore pour ton aide et bonne journée,

Baboutz

comment gères-tu le clic sur le check-box ? par onEdit(e) ? alors affecte-lui un trigger (déclencheur) sur modification

en effet, onEdit est un "simple trigger" https://developers.google.com/apps-script/guides/triggers assez souple d'emploi, mais en contrepartie, pour des questions de sécurité, google ne lui donne pas tous les droits sauf si on le déclare comme "installable trigger"

C'est ce qu'on avait vu ensemble l'autre fois ! En effet, je gère ça avec Onedit(e).

Il me faut encore un trigger ?

ben, je ne sais pas, mais sans doute vu les symptômes, essaie toujours ...

Bonjour Mikhail,

Désolé, j'ai fait une petite pause sur ce fichier.

Je m'y suis re-attaqué ce matin, et ce qui est pas mal avec un trigger, c'est que l'on peut voir le taux d'erreur et également l'origine des erreurs !

Voilà l'erreur que m'affiche le trigger, c'est malheureusement bien evaluate() qui bloque :

image

Ce n'est pas la première fois que j'utilise evaluate() ... il y a un truc à voir (je t'ai envoyé un exemple en mp)

Mais je me dis que dans ton cas, il y a peut-être moyen de ne pas utiliser evaluate, c'est tout simplement de stocker dans une cellule le n° de ligne quand tu actives le onEdit, valeur que tu récupères au retour du formulaire donc sans avoir à mettre la ligne dans un input hidden

Il va quand m^me falloir tirer au clair ce bug

Il faut que tu mettes sur 2 lignes

HtmlService
    .createTemplateFromFile("AjoutBD")
    .evaluate();

pour que evaluate s'applique à HTMLService et non à createTemplateFromFile

et sans point-virgule après createTemplateFromFile

Re,

C'est bien ce que j'avais fait, sans succès...

Du coup, je me suis penché sur la première méthode que j'avais trouvé, et j'ai trouvé pourquoi ça ne marchait pas ! La propriété propertiesService me convertissait mon numéro de ligne en string, et pour une raison improbable, cela me convertissait par exemple "15" en "15.0"

Du coup, il ne me restait qu'à récupérer seulement le "15" pour avoir mon numéro de ligne et l'utiliser.

Ce qui me donne en terme de code, de façon abrégé :

var scriptProperties = PropertiesService.getScriptProperties();

function onEdit(e){
  var row = e.range.getRow();
  scriptProperties.setProperty('row', row);
}

// Insertion des données du formulaire
function ajouterLigne(tab) {
  var row = scriptProperties.getProperty('row');
  var row2 = row.substring(0, row.indexOf("."));

  SpreadsheetApp.getActiveSheet().getRange(row2,5).setValue(tab[0])
  SpreadsheetApp.getActiveSheet().getRange(row2,6).setValue(tab[1])
}

Merci encore pour ton aide !

Bonne journée,

Baboutz

Cher Baboutz

je ne sais plus à quelle occasion on parlait compatibilité avec android

voici la réponse avisée de Gilbert

https://forum.excel-pratique.com/sheets/utiliser-la-fonction-google-sheet-script-sur-android-156998#...

Bonjour,

Merci, très intéressant ! J'essaierai à l'occasion !

Rechercher des sujets similaires à "variable globale onedit"