Cellule du dessus

Bonjour

j'ai un petit soucis avec google sheet j'espère trouve une réponse !

Je vous explique , j'ai trouvé un script sur le net pour automatiser une facture a partir d'un template et d'un document sheet lui même à partir d'un formulaire google form .

Tous fonctionne à merveille j'ai fait mes changement mis en Français Ok.

Le seul truc qui me pose problème c'est pour les numéros de facture , j'aimerai bien qu'il s'incrémente automatiquement sans que j'ai à les taper manuellement .

J'ai donc essayé des formules sur Sheet ca fonctionne sur le tableur mais vu que la ligne à déjà été rempli le formulaire passe à la ligne vide suivant directement et ne prend pas en compte ce que j'ai ajouté .

Du coup je me suis dis que le plus simple serai d'ajouter une case à cocher sur google form avec un texte prédéfini qui le mettra sur le Sheets avec une formule du genre = case du dessus + 1, le +1 je peut le mettre dans une case pas de souci mais c'est le "case au dessus" que je n'arrive a mettre en place sans nommé la case .

Ou si quelqu'un a une autre solution je prend haha , merci !

Bonjour,

le plus simple serai d'ajouter une case à cocher sur google form avec un texte prédéfini qui le mettra sur le Sheets avec une formule du genre = case du dessus + 1

hum ... j'avoue que je n'ai pas vraiment l'idée de comment faire cela !

mais il y a 2 autres façons d'attribuer ce numéro en automatique

  • dans la feuille qui reçoit les données de la google form, tu peux ajouter une formule en arrayformula en ligne 1 qui s'appliquera à toute nouvelle ligne
  • autres solution est d'ajouter une fonction de type onFormSubmit (avec un déclencheur) qui attribuera le n°

peux-tu donner un fac-similé de la feuille avec ta logique d'attribution du n° de facture ?

dans la feuille qui reçoit les données de la google form, tu peux ajouter une formule en arrayformula en ligne 1 qui s'appliquera à toute nouvelle ligne

Je ne peut rien mettre en ligne 1 , j'ai justement indiqué facture n° et c'est ce dont le script se sert pour générer le fichier sortant

autres solution est d'ajouter une fonction de type obFormSubmit (avec un déclencheur) qui attribuera le n°

alors la j'ai pas suivit je connais pas du tous cette fonction encore moins comment la faire fonctionné avec un déclencheur

peux-tu donner un fac-similé de la feuille avec ta logique d'attribution du n° de facture ?

une facture simulé c'est ca ? ma logique d'attribution c'est tous simple 1er facture n°1 , 2eme n°2,... et ainsi de suite

https://docs.google.com/document/d/1MNzsSDBEX0i-tKZvrQPEpZdfxQFaxNGm6GPTbH7LXD4/edit?usp=sharing

Désolé pour la réponse tardive je n'ai pas pu répondre avant

Si jamais voici le code que j'ai récupéré et modifié

///////////////////////////////////////////////////////////////////////////////////////////////
// BEGIN EDITS ////////////////////////////////////////////////////////////////////////////////

const TEMPLATE_FILE_ID = '1_DRQtFug4_AoZUfAJ_N_EoUanDkh9zqWNUVvG_5dQRw';
const DESTINATION_FOLDER_ID = '1p1C_r7B5mf_nsS_bJVsv-VTDCZ4sJuby';
const CURRENCY_SIGN = '€';

// END EDITS //////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: EDITING ANYTHING BELOW THIS LINE WILL CHANGE THE BEHAVIOR OF THE SCRIPT. //////////
// DO SO AT YOUR OWN RISK.//// ////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------------------- //

// Converts a float to a string value in the desired currency format
function toCurrency(num) {
    var fmt = Number(num).toFixed(2);
    return `${CURRENCY_SIGN}${fmt}`;
}

// Format datetimes to: YYYY-MM-DD
function toDateFmt(dt_string) {
  var millis = Date.parse(dt_string);
  var date = new Date(millis);
  var year = date.getFullYear();
  var month = ("0" + (date.getMonth() + 1)).slice(-2);
  var day = ("0" + date.getDate()).slice(-2);

  // Return the date in YYYY-mm-dd format
  return `${year}-${month}-${day}`;
}

// Parse and extract the data submitted through the form.
function parseFormData(values, header) {
    // Set temporary variables to hold prices and data.
    var subtotal = 0;
    var discount = 0;
    var response_data = {};

    // Iterate through all of our response data and add the keys (headers)
    // and values (data) to the response dictionary object.
    for (var i = 0; i < values.length; i++) {
      // Extract the key and value
      var key = header[i];
      var value = values[i];

      // If we have a price, add it to the running subtotal and format it to the
      // desired currency.
      if (key.toLowerCase().includes("price")) {
        subtotal += value;
        value = toCurrency(value);

      // If there is a discount, track it so we can adjust the total later and
      // format it to the desired currency.
      } else if (key.toLowerCase().includes("discount")) {
        discount += value;
        value = toCurrency(value);

      // Format dates
      } else if (key.toLowerCase().includes("date")) {
        value = toDateFmt(value);
      }

      // Add the key/value data pair to the response dictionary.
      response_data[key] = value;
    }

    // Once all data is added, we'll adjust the subtotal and total
    response_data["sub_total"] = toCurrency(subtotal);
    response_data["total"] = toCurrency(subtotal - discount);

    return response_data;
}

// Helper function to inject data into the template
function populateTemplate(document, response_data) {

    // Get the document header and body (which contains the text we'll be replacing).
    var document_header = document.getHeader();
    var document_body = document.getBody();

    // Replace variables in the header
    for (var key in response_data) {
      var match_text = `{{${key}}}`;
      var value = response_data[key];

      // Replace our template with the final values
      document_header.replaceText(match_text, value);
      document_body.replaceText(match_text, value);
    }

}

// Function to populate the template form
function createDocFromForm() {

  // Get active sheet and tab of our response data spreadsheet.
  var sheet = SpreadsheetApp.getActiveSheet();
  var last_row = sheet.getLastRow() - 1;

  // Get the data from the spreadsheet.
  var range = sheet.getDataRange();

  // Identify the most recent entry and save the data in a variable.
  var data = range.getValues()[last_row];

  // Extract the headers of the response data to automate string replacement in our template.
  var headers = range.getValues()[0];

  // Parse the form data.
  var response_data = parseFormData(data, headers);

  // Retreive the template file and destination folder.
  var template_file = DriveApp.getFileById(TEMPLATE_FILE_ID);
  var target_folder = DriveApp.getFolderById(DESTINATION_FOLDER_ID);

  // Copy the template file so we can populate it with our data.
  // The name of the file will be the company name and the invoice number in the format: DATE_COMPANY_NUMBER
  var filename = `${response_data["Date"]}_${response_data["Nom Prénom"]}_${response_data["Facture n°"]}`;
  var document_copy = template_file.makeCopy(filename, target_folder);

  // Open the copy.
  var document = DocumentApp.openById(document_copy.getId());

  // Populate the template with our form responses and save the file.
  populateTemplate(document, response_data);
  document.saveAndClose();

}

une facture simulé c'est ca ? ma logique d'attribution c'est tous simple 1er facture n°1 , 2eme n°2,... et ainsi de suite

https://docs.google.com/document/d/1MNzsSDBEX0i-tKZvrQPEpZdfxQFaxNGm6GPTbH7LXD4/edit?usp=sharing

ok merci, mais je me suis trompé, je voulais dire un fichier GSheets (si possible simplifié) qui montre comment est donné le n° de facture, mais tu as répondu

je regarde dans la journée ...

dans la feuille qui reçoit les données de la google form, tu peux ajouter une formule en arrayformula en ligne 1 qui s'appliquera à toute nouvelle ligne

Je ne peut rien mettre en ligne 1 , j'ai justement indiqué facture n° et c'est ce dont le script se sert pour générer le fichier sortant

il est tout à fait possible de mettre à la place de facture n°

={"facture n°";arrayformula(if (A2:A="",,row(A2:A)-1))}

dès l'apparition d'une nouvelle donné en A le n° de facture apparaîtra

image

il faut que la colonne à partir de la ligne 2 soit vierge pour permettre à la formule de fonctionner et propager le n°

il faut que la colonne à partir de la ligne 2 soit vierge pour permettre à la formule de fonctionner et propager le n°

J'ai pas compris , j'obtiens une erreur j'ai du oublié quelque chose non ?

capture

ma proposition était en notation US/CH/GB

en notation FR

={"facture n°";arrayformula(if (A2:A="";;row(A2:A)-1))}

... mais je vois que le n° est aussi dans le formulaire ! si quelqu'un met quelque chose cela va enrayer la formule

il faut peut-être passer cette question en hidden ?

Yep je viens de voir que tu la modifié , merci mais ca ne fonctionne pas :/ la valeur est bien modifié mais ne vient pas se mettre en place sur la facture généré :/

Je viens de trouver avec la formule !

Sur mon script c'est "F" majuscule sur Formule , il l'était en minuscule sur la ligne sheet tous fonctionne , merci à vous !

J'ai deux dernière question si je peut me peux me permettre sur mon code :

J'aimerai ajouté une quantité qui servirai à multiplié les valeurs, ainsi que sortir le document en pdf.

Je pense avoir une solution pour mon code et les multiplication avec des quantité , sans modifié le script .

Mon script se sert de valeur {{prix}} pour les afficher , mais si sur mon formulaire j'ajoute des questions quantité et prix unitaire mai que je retire {{prix}} et qu'a la place je met une formule prix unitaire x quantité cela devrai fonctionner sans touché le code non ?

Je parle beaucoup tous seul , haha je viens d'essayer mais j'ai le même problème que pour les numéros de facture du coup , il me faudrai une formule avec "ARRAYFORMULA" je suppose en ligne 1 un truc du genre

={"prix1";arrayformula(quantité*prix unitaire)}

qui se répète mais je n'arrive pas à comprendre la formule

En réflechissant j'ai mis et ca fonctionne

={"prix1";arrayformula(SI (A2:A="";;(R2:R*S2:S)))}

reste plus qu'a trouver comment mettre ca en pdf

C'est ce que tu m'avais indiqué ...

peux-tu donner un fac-similé de la feuille avec ta logique d'attribution du n° de facture ?

une facture simulé c'est ca ? ma logique d'attribution c'est tous simple 1er facture n°1 , 2eme n°2,... et ainsi de suite

le principal est que le problème est résolu.

je regarde pour le pdf

pour le transfert en pdf

function convertPDF(docID) {
  var doc = DocumentApp.openById(docID);
  var docblob = doc.getAs('application/pdf');
  docblob.setName(doc.getName() + ".pdf");
  var file = DriveApp.createFile(docblob);
  console.log('Your PDF file is available at ' + file.getUrl());
}

que tu peux appeler par

convertPDF(document_copy.getId());

J'ajoute ca dans mon code ? et je l'automatise avec un déclencheur ?

Je suppose que j'ai du me trompé quelque part

capture

J'ai juste copier coller en bas de mon code et ajouté le déclencheur

Je suis désolée je suis ne pas douée avec ca

Bon j'ai réussi a généré le pdf en changeant le code sauf que c'est mon template qui est sur le pdf --'

// Populate the template with our form responses and save the file.
  populateTemplate(document, response_data);
  var docblob = document_copy.getAs('application/pdf');
  docblob.setName(document_copy.getName() + ".pdf");
  var file = DriveApp.createFile(docblob);
  console.log('Your PDF file is available at ' + file.getUrl());
  document.saveAndClose();
  }
  

C'est ce que j'ai fait en ajouté les ligne sur mon code d'origine

// Populate the template with our form responses and save the file.
  populateTemplate(document, response_data);
  document.saveAndClose();
  }
Rechercher des sujets similaires à "dessus"