Standalone-Skript - Öffnen Sie eine Google Sheet-Datei

Sep 12 2020

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

ale13 Sep 14 2020 at 17:42

Wenn Sie einfach die angegebene URL öffnen möchten, können Sie UrlFetchAppstattdessen Folgendes verwenden:

UrlFetchApp.fetch(url);

Referenz

  • UrlFetchApp-Klasse
adblayrog Sep 14 2020 at 20:25

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!