Standalone-Skript - Öffnen Sie eine Google Sheet-Datei
Ich habe ein eigenständiges Skript geschrieben, das als Webanwendung bereitgestellt wird. Der Sinn des Skripts besteht darin, dass durch Klicken auf eine Schaltfläche eine Google Sheet-Datei in ein bestimmtes Verzeichnis kopiert wird und die neue Datei geöffnet werden soll. Mein Code blockiert das Öffnen der neuen Datei. Die Teile 1 und 2 in codeTest.gs funktionieren einwandfrei (ungefähr ausgehend von dem Wert, der mit der angeklickten Schaltfläche verknüpft ist, sucht das Skript in einer Google Sheet-Datei nach dem Namen des Formulars sowie dem Speicherort, an den es kopiert werden muss).
In meinem Code werden Sie feststellen, dass es sich um ein Formular handelt, es sich jedoch tatsächlich um eine Google Sheet-Datei handelt (in der Praxis ist die Google Sheet-Datei ein auszufüllendes Dokument, das einem Formular ähnelt).
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>
Ich bin nicht Mitglied der aufgerufenen Funktionen, weil sie gut funktionieren. Wenn ich ein logger.log (URL) mache, um den Wert der in Zeile 34 von codeTest.gs definierten Variablen zu überprüfen, enthält es tatsächlich die URL der neu erstellten Datei.
Ich frage mich, warum der letzte Teil nicht funktioniert:
// 3 - on ouvre le nouveau fichier créé
var url=newForm.getUrl;
var htmlString = "<script>window.open('" + url +"');</script>";
return HtmlService.createHtmlOutput(htmlString);
Dieser Code funktioniert einwandfrei, wenn ich ihn alleine an anderer Stelle verwende, aber nicht hier. Liegt es daran, dass Sie HtmlService im selben Skript nicht zweimal verwenden können? Ich konnte nichts über diese Einschränkung finden, sehe aber keine anderen Gründe.
Leider kann ich die in meinem Code genannten Dokumente nicht mit Ihnen teilen. Ich bin in einem Unternehmen mit einer Domain, die nicht mit anderen Konten als unseren geteilt werden kann.
Es tut mir leid für mein Englisch ...
Antworten
Wenn Sie einfach die angegebene URL öffnen möchten, können Sie UrlFetchAppstattdessen Folgendes verwenden:
UrlFetchApp.fetch(url);
Referenz
- UrlFetchApp-Klasse
Mit Diego's Vorschlag bin ich dazu gekommen und es funktioniert:
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, UrlFetchApp-Klasse klingt interessant. Ich werde mich auch erkundigen.
Vielen Dank!