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...