Signature Manuscrite dans google sheet

Bonjour

Petite question, y'a t'il une méthode ou solution pour pouvoir faire signer des personnes à partir d'une tablette (style Wacom) dans un Sheet google.

J'ai un listing de personnes, je dois les faire signer à la remise d'un pack et au lieu d'imprimer du papier...ca serait appréciable de les faire signer sur l'ordi.
(plus de 1500 personnes).

Si vous avez une idée solution...

Bonjour,

Oui possible à l'aide d'un script, par contre c'est du niveau 1.

Bonjour Pierre
Niveau 1, c'est à dire haut niveau j'imagine ?

J'ai bien trouvé un petit script ou en cliquant sur un bouton, j'ouvre une fenetre dans laquelle je signe, ca stocke dans un drive un fichier jpg.
Ca devait mettre ensuite l'image dans la cellule active.
Mais flop , ça crée le fichier image mais illisible et ca fait rien ensuite.
D'où ma demande içi.
Je l'avais fait sous Excel mais changement de suite donc je cherchais la même fonction sous google mais elle existe pas de base.

Non, c'est le niveau le plus bas mais suivant les usages ça peut suffire :

https://www.francenum.gouv.fr/guides-et-conseils/pilotage-de-lentreprise/dematerialisation-des-docum...

Concernant le script en lui même je bosse actuellement sur un qui fonctionne, mais la signature est au dessus d'une cellule...

Quoi le 1 c'est en bas du podium ...bon au moins je suis premier sur quelques choses

dans l'idée moi je voudrais que pour chaque bénévole, en bout de ligne je retrouve sa signature.

ca évite de sortir 50 feuilles qui finiront à la poubelle

ce doit être réalisable, avec une popup html, un bouton ou menu "faire signer bénévole"

le script itère sur la liste, la présence ou non de signature dans la colonne voulue, puis génère une liste avec uniquement les bénévoles n'ayant pas encore signé.

donc, l'user choisi son nom dans la liste, signe, valide, puis la signature s'ajoute dans la colonne en face de son nom.

Voila...
Moi j'ai réussi à faire le bouton qui ouvre le popup html...je vois la signature...
et plus rien.
le fichier image généré dans le drive illisible donc rien n'est importe ensuite dans la cellule.
D'ou mon appel à l'aide.

Pouvez-vous copier ici votre script google et html ?

le script

function signerDocument()

{

var celluleActive = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getActiveCell();

var feuilleActive = celluleActive.getSheet();

var urlImage = afficherBoiteDialogueSignature();

if (urlImage !== null) {

feuilleActive.getRange(celluleActive.getRow(), celluleActive.getColumn()).setValue(urlImage);

}

}

function afficherBoiteDialogueSignature()

{

var html = HtmlService.createHtmlOutputFromFile('FormulaireSignature') .setWidth(550) .setHeight(450);

SpreadsheetApp.getUi().showModalDialog(html, 'Signer le document');

}

function enregistrerSignature(signature)

{

var image = Utilities.newBlob(signature, 'image/jpeg', 'signature.jpg');

var dossier = DriveApp.getFolderById('ID_DU_DOSSIER_DE_STOCKAGE');

// Remplacez ID_DU_DOSSIER_DE_STOCKAGE par l'ID du dossier où vous souhaitez enregistrer les signatures

if (dossier) {

var fichier = dossier.createFile(image);

if (fichier) {

return fichier.getUrl();

} else {

return null;

} else {

return null;

}

}

Et le html

<!DOCTYPE html>

<html>

<head>

<base target="_top">

</head>

<body>

<canvas id="canvas" width="200" height="100"></canvas>

<button onclick="enregistrerSignature()">Enregistrer la signature</button>

<script>

var canvas = document.getElementById('canvas');

var context = canvas.getContext('2d');

var dessiner = false;
canvas.addEventListener('mousedown', function(event) {

dessiner = true;

context.beginPath();

context.moveTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);

});
canvas.addEventListener('mousemove', function(event) {

if (dessiner) {

context.lineTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);

context.stroke();

}

});
canvas.addEventListener('mouseup', function() {

dessiner = false;

});
function enregistrerSignature() {

google.script.run.enregistrerSignature(canvas.toDataURL());

google.script.host.close();

}

</script>

</body>

</html>

Grosso modo ça semble correct, l'image générée est illisible ?

Oui le fichier est bien créé mais illisible en ligne et en le téléchargeant.
même pas une page blanche, il me dit qu'il peut pas le lire.

à tester :

Pour générer la fenêtre :

function popupSignature() {
  var htmlOutput = HtmlService.createHtmlOutputFromFile('popUpSignature')
      .setWidth(450)
      .setHeight(450)

  SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Signez ci-dessous');
}

Script HTML : (à nommer : popUpSignature)

<!DOCTYPE html>
<html>
<head>
    <title>Signature Popup</title>
    <style>
        #canvas {
            border: 1px solid #000;
            width: 400px;
            height: 200px;
            margin-bottom: 20px;
        }
        .actionButton {
            background-color: #15d798;
            color: white;
            border: none;
            border-radius: 5px;
            padding: 10px 30px;
            cursor: pointer;
            margin-right: 10px;
            margin-bottom: 10px;
            font-size: 16px;
            width: 100%;
            max-width: 200px;
            box-sizing: border-box;
        }

        .actionButton:hover {
            background-color: #0fbf7c;
        }

        .buttonContainer {
            display: flex;
            flex-direction: column;
            align-items: center;
        }
    </style>
</head>
<body>
    <div class="buttonContainer">
        <div id="canvasContainer">
            <canvas id="canvas" width="400" height="200"></canvas>
        </div>
        <div class="buttonContainer">
            <button class="actionButton" onclick="saveSignature()">Valider</button>
            <button class="actionButton" onclick="clearSignature()">Effacer</button>
        </div>
    </div>

    <script>
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
        var drawing = false;
        var prevX = 0;
        var currX = 0;
        var prevY = 0;
        var currY = 0;

        function draw(e) {
            if (!drawing) return;
            e.preventDefault(); 
            if (e.touches && e.touches.length > 0) {
                currX = e.touches[0].clientX - canvas.getBoundingClientRect().left;
                currY = e.touches[0].clientY - canvas.getBoundingClientRect().top;
            } else {
                currX = e.clientX - canvas.getBoundingClientRect().left;
                currY = e.clientY - canvas.getBoundingClientRect().top;
            }
            ctx.beginPath();
            ctx.moveTo(prevX, prevY);
            ctx.lineTo(currX, currY);
            ctx.strokeStyle = 'black';
            ctx.lineWidth = 2;
            ctx.stroke();
            ctx.closePath();
            prevX = currX;
            prevY = currY;
        }
        canvas.addEventListener('mousedown', function (e) {
            if (!isTouchDevice()) {
                drawing = true;
                prevX = e.clientX - canvas.getBoundingClientRect().left;
                prevY = e.clientY - canvas.getBoundingClientRect().top;
            }
        });

        canvas.addEventListener('mousemove', draw);
        canvas.addEventListener('mouseup', function () {
            drawing = false;
        });
        canvas.addEventListener('touchstart', function (e) {
            drawing = true;
            prevX = e.touches[0].clientX - canvas.getBoundingClientRect().left;
            prevY = e.touches[0].clientY - canvas.getBoundingClientRect().top;
        });
        canvas.addEventListener('touchmove', draw);
        canvas.addEventListener('touchend', function () {
            drawing = false;
        });
        function saveSignature() {
            var tempCanvas = document.createElement('canvas');
            var tempCtx = tempCanvas.getContext('2d');
            tempCanvas.width = 200; 
            tempCanvas.height = 100;
            tempCtx.drawImage(canvas, 0, 0, 200, 100);
            var dataURL = tempCanvas.toDataURL();
            google.script.run.withSuccessHandler(closeDialog).exportImage(dataURL);
        }
        function closeDialog() {
            google.script.host.close(); 
        }

        function clearSignature() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
        }
          function isTouchDevice() {
            return 'ontouchstart' in window || navigator.maxTouchPoints;
        }
    </script>
</body>
</html>

Puis la fonction google qui récupère l'image et l'insère (dans cet exemple en A1) :

function exportImage(dataURL) {
  var imageURL = dataURL.split(",");
  var blob = Utilities.newBlob(Utilities.base64Decode(imageURL[1]), 'image/png');
  blob.setName("TEMP_signature");
  var file = DriveApp.createFile(blob);
  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().insertImage(blob, 1, 1); // 1, 1 = A1
  DriveApp.getFileById(file.getId()).setTrashed(true);
}

C'est top ca fonctionne bien.

Juste petite question actuellement il me pose sur A1 la signature comme une image SUR les cellules.

avec la fonction insertCellIImage, possible de modifier ton script pour qu'il insère la signature DANS la cellule ?

j'ai essayé en vain

si tu y arrives ça m'interesse.

Coucou

Bon je reviens sur le sujet.
Impossible à l'heure actuelle d'insérer une signature directement dans une cellule.
J'ai trouvé comment enregistrer par contre dans le drive, et l'idée c'est qu'avec l'url je l'affiche ensuite dans mon sheet.
Ca marche sauf que je ne vois pas l'image.
Il crée bien l'image, il me donne bien l'url si je clique dessus je file vers l'image

mais la fonction image(url) n'affiche rien.

Une idée ?

J'avais déjà tenté aussi, le lien drive ne fonctionne pas, même quand le lien est public, une solution serai d'envoyer l'image sur un service d’hébergement en ligne, via une API et de récupérer le lien généré.

Bon j'ai eu la réponse sur une autre question pour ma photo qui ne s'affichait pas.

Par contre j'ai réussi la signature DANS la cellule

J'arrive à faire signer, et enregistrer dans un dossier de mon drive la signature.
Et ensuite en récuperant l'url de l'image je l'insère dans une cellule sans problème.
y'a un peu de latence mais c'est gérable.

je te mets le script et l'html en dessous

dans mon exemple j'ai en A1 le nom d'une personne, je la fais signer, ca enregistre la signature dans le drive à son nom, et l'intègre ensuite dans la cellule.

function onOpen() {
  SpreadsheetApp.getUi().createMenu('Signature').addItem('Ajouter Signature', 'showSignatureDialog').addToUi();
}

function showSignatureDialog() {
  var html = HtmlService.createHtmlOutputFromFile('Index')
      .setWidth(400)
      .setHeight(300)
      .setTitle('Ajouter Signature Manuscrite');
  SpreadsheetApp.getUi().showModalDialog(html, 'Signature');
}

function saveSignature(dataURL) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var folderName = "Signature"; // Nom du dossier
  var parentFolders = DriveApp.getRootFolder().getFoldersByName(folderName);
  var folder;

  // Vérifie si le dossier existe déjà
  if (parentFolders.hasNext()) {
    folder = parentFolders.next();
  } else {
    // Crée le dossier s'il n'existe pas
    folder = DriveApp.getRootFolder().createFolder(folderName);
  }

  var name = sheet.getRange('A1').getValue();

  // Convert dataURL to blob
  var data = dataURL.split(',')[1];
  var blob = Utilities.newBlob(Utilities.base64Decode(data), 'image/png', name + '.png');

  // Enregistre l'image dans le dossier
  var file = folder.createFile(blob);
  var imageId = file.getId();
  var imageUrl = '=IMAGE("https://drive.google.com/uc?id=' + imageId + '")';

  // Insère l'URL de l'image dans la cellule D1
  sheet.getRange('D1').setValue(imageUrl);

  // Ferme la boîte de dialogue modale
  var ui = SpreadsheetApp.getUi();
  ui.alert('Signature ajoutée avec succès.');
  // ui.showModalDialog(HtmlService.createHtmlOutput(''), 'Fermer');
}
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <style>
      #signatureContainer {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        border: 1px solid black;
        background-color: #fff;
        padding: 20px;
      }
    </style>
  </head>
  <body>
    <div id="signatureContainer">
      <canvas id="canvas" style="border:1px solid black;" width="300" height="150"></canvas>
      <br>
      <button id="clear">Effacer</button>
      <button id="save">Sauvegarder</button>
    </div>

    <script>
      window.onload = function() {
        var canvas = document.getElementById('canvas');
        var context = canvas.getContext('2d');

        var painting = false;

        // Fonction pour démarrer le dessin
        function startPosition(e) {
          painting = true;
          draw(e);
        }

        // Fonction pour arrêter le dessin
        function endPosition() {
          painting = false;
          context.beginPath();
        }

        // Fonction pour dessiner
        function draw(e) {
          if (!painting) return;
          context.lineWidth = 2;
          context.lineCap = 'round';
          context.strokeStyle = 'black';

          // Coordonnées du curseur
          var rect = canvas.getBoundingClientRect();
          var x = e.clientX - rect.left;
          var y = e.clientY - rect.top;

          // Dessiner
          context.lineTo(x, y);
          context.stroke();
          context.beginPath();
          context.moveTo(x, y);
        }

        // Événements de souris
        canvas.addEventListener('mousedown', startPosition);
        canvas.addEventListener('mouseup', endPosition);
        canvas.addEventListener('mousemove', draw);
        canvas.addEventListener('mouseout', endPosition);

        // Clear the canvas
        document.getElementById('clear').addEventListener('click', function() {
          context.clearRect(0, 0, canvas.width, canvas.height);
        });

        // Save the signature
        document.getElementById('save').addEventListener('click', function() {
          var dataURL = canvas.toDataURL();
          google.script.run.saveSignature(dataURL);
          google.script.host.close();
        });
      };
    </script>
  </body>
</html>

Super !

J'avais fais pleins de tentatives, dont certaines alambiqués mais ça n'a rien donné, je vais tester sur ma version voir si ça fonctionne bel et bien.

Penses à ouvrir le dossier signature accessible avec lien. Sinon il lit pas la photo.

Bonjour Messieurs,

Je suis tombé par hasard sur votre sujet, il est très intéressant et pourrait être utile à pas mal de personne notamment pour les formations.
Merci à vous pour l'outil,
cependant je n'arrive pas une erreur sur cette ligne :

var data = dataURL.split(',')[1];

Voici mon erreur :
TypeError: Cannot read properties of undefined (reading 'split')

C'est surement un truc tout bête que j'ai oublier de faire de mon coté, mais je ne vois pas comment fixer cette erreur...
Bonne journée,

Rechercher des sujets similaires à "signature manuscrite google sheet"