4 votes

Standalone script - ouvrir un fichier google sheet

J'ai écrit un script autonome déployé comme une application web. Le point du script est qu'en cliquant sur un bouton un fichier Google Sheet est copié dans un répertoire spécifique, puis je veux que le nouveau fichier s'ouvre. Mon code est bloquant pour ouvrir le nouveau fichier. Les parties 1 et 2 du codeTest.gs fonctionnent parfaitement (en gros à partir de la valeur associée au bouton cliqué, le script va chercher dans un fichier Google Sheet le nom à donner au formulaire ainsi que l'emplacement où il doit être copié).

Dans mon code, vous remarquerez que je parle d'un formulaire, mais il s'agit en fait d'un fichier Google Sheet (en pratique, le fichier Google Sheet est un document à remplir qui s'apparente à un formulaire).

codeTest.gs

function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('page');
}

function fctOpenForm(idForm){

  // fonction qui va faire une copie du formulaire pour ensuite l'ouvrir (on préserve ainsi l'original)

  // 1 - on va chercher en fonction de l'id du formulaire le répertoire où il doit être copié
    // 1.1 - on "ouvre" le fichier de configuration
    var ssConfigId="1AegVIBq_pOLxhCGb7qcUr-wmCFIk7KRqQ5sB3HBDU04";
    var ssConfig=SpreadsheetApp.openById(ssConfigId);
    var shtListeForms=ssConfig.getSheetByName("Liste des formulaires");
    // 1.2 - on identifie les lignes et colonnes importantes du tableau
    var derLig=ssConfig.getLastRow();
    var derCol=ssConfig.getLastColumn();
    var ligEntete=fctFindLigne(shtListeForms,"Nom du formulaire",1,derLig,1);
    var colNomForm=fctFindColonne(shtListeForms,"Nom du formulaire",1,derCol,ligEntete);
    var colIdForm=fctFindColonne(shtListeForms,"Id du formulaire",1,derCol,ligEntete);
    var colIdRepDest=fctFindColonne(shtListeForms,"Id du répertoire de destination de la copie",1,derCol,ligEntete);
    // 1.3 - on cherche l'id du répertoire de destination de la copie
    var idRepDest=shtListeForms.getRange(fctFindLigne(shtListeForms,idForm,ligEntete,derLig,colIdForm),colIdRepDest).getValue();
    // 1.4 - on cherche le nom du formulaire
    var nomForm=shtListeForms.getRange(fctFindLigne(shtListeForms,idForm,ligEntete,derLig,colIdForm),colNomForm).getValue();

  // 2 - on copie le formulaire
  var folderDest=DriveApp.getFolderById(idRepDest);
  var newForm=DriveApp.getFileById(idForm).makeCopy("*"+nomForm,folderDest);
  var newFormId=newForm.getId();

  // 3 - on ouvre le nouveau fichier créé
  var url=newForm.getUrl;
  var htmlString = "<script>window.open('" + url +"');</script>";
  return HtmlService.createHtmlOutput(htmlString);

}

page.html

<!DOCTYPE html>
<html>
  <h1>Choix du formulaire</h1>
  <p>Cliquer sur le formulaire souhaité</p>

  <button value="1uZwENM_Ilmo7hXLHNYaQP6GdJbuq8QlXkoiY0sIX8KQ" onclick="fctGetValue(this)">Prise de rendez-vous</button>
  <button value="rembEnLigne" onclick="fctGetValue(this)">Remboursement - paiement initial en ligne</button>
  <button value="rembComptoir" onclick="fctGetValue(this)">Remboursement - paiement initial au comptoir</button>

  <script>
    function fctGetValue(element){
      var idForm=element.value;
      google.script.run.fctOpenForm(idForm);
    }

  </script>

</html>

Je ne rejoins pas les fonctions appelées car elles fonctionnent bien. En effet, si je fais un logger.log (url) pour vérifier la valeur de la variable définie à la ligne 34 de codeTest.gs, elle contient bien l'url du nouveau fichier créé.

Je me demande pourquoi la dernière partie ne fonctionne pas :

  // 3 - on ouvre le nouveau fichier créé
  var url=newForm.getUrl;
  var htmlString = "<script>window.open('" + url +"');</script>";
  return HtmlService.createHtmlOutput(htmlString);

Ce bout de code fonctionne bien si je l'utilise ailleurs, mais pas ici. Est-ce parce que dans le même script vous ne pouvez pas utiliser HtmlService deux fois ? Je n'ai rien trouvé sur cette limitation, mais je ne vois pas d'autres raisons.

Malheureusement je ne peux pas partager avec vous les documents mentionnés dans mon code, je suis dans une entreprise avec un domaine non partageable avec d'autres comptes que le nôtre.

Je suis désolé pour mon anglais...

0voto

ale13 Points 3412

Si vous voulez simplement ouvrir l'URL mentionnée, vous pouvez utiliser UrlFetchApp à la place, comme ceci :

UrlFetchApp.fetch(url);

Référence

0voto

adblayrog Points 41

Avec la suggestion de Diego, je suis arrivé à ceci, et ça marche :

page.html

<!DOCTYPE html>
<html>
  <body onload='fctOpenFile()'>
    <h1>Choix du formulaire</h1>
    <p>Cliquer sur le formulaire souhaité</p>

    <button value="1uZwENM_Ilmo7hXLHNYaQP6GdJbuq8QlXkoiY0sIX8KQ" onclick="fctGo(this)">Prise de rendez-vous</button>
    <button value="rembEnLigne" onclick="fctGetValue(this)">Remboursement - paiement initial en ligne</button>
    <button value="rembComptoir" onclick="fctGetValue(this)">Remboursement - paiement initial au comptoir</button>
  </body>

    <script>

      function fctGo(element){
        var idForm=element.value;
        google.script.run.withSuccessHandler(fctOpenByUrl).fctOpenForm(idForm);
      }

      function fctOpenByUrl(url){
        window.open(url);
      }

    </script>

</html>

codeTest.gs

function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('page');
}

function fctOpenForm(idForm){

  // fonction qui va faire une copie du formulaire pour ensuite l'ouvrir (on préserve ainsi l'original)

  // 1 - on va chercher en fonction de l'id du formulaire le répertoire où il doit être copié
    // 1.1 - on "ouvre" le fichier de configuration
    var ssConfigId="1AegVIBq_pOLxhCGb7qcUr-wmCFIk7KRqQ5sB3HBDU04";
    var ssConfig=SpreadsheetApp.openById(ssConfigId);
    var shtListeForms=ssConfig.getSheetByName("Liste des formulaires");
    // 1.2 - on identifie les lignes et colonnes importantes du tableau
    var derLig=ssConfig.getLastRow();
    var derCol=ssConfig.getLastColumn();
    var ligEntete=fctFindLigne(shtListeForms,"Nom du formulaire",1,derLig,1);
    var colNomForm=fctFindColonne(shtListeForms,"Nom du formulaire",1,derCol,ligEntete);
    var colIdForm=fctFindColonne(shtListeForms,"Id du formulaire",1,derCol,ligEntete);
    var colIdRepDest=fctFindColonne(shtListeForms,"Id du répertoire de destination de la copie",1,derCol,ligEntete);
    // 1.3 - on cherche l'id du répertoire de destination de la copie
    var idRepDest=shtListeForms.getRange(fctFindLigne(shtListeForms,idForm,ligEntete,derLig,colIdForm),colIdRepDest).getValue();
    // 1.4 - on cherche le nom du formulaire
    var nomForm=shtListeForms.getRange(fctFindLigne(shtListeForms,idForm,ligEntete,derLig,colIdForm),colNomForm).getValue();

  // 2 - on copie le formulaire
  var folderDest=DriveApp.getFolderById(idRepDest);
  var newForm=DriveApp.getFileById(idForm).makeCopy("*"+nomForm,folderDest);
  var newFormId=newForm.getId();
  return newForm.getUrl();

}

Ale13, la classe UrlFetchApp semble intéressante. Je vais me renseigner également.

Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X