Автономный скрипт — открыть файл Google Sheet

#javascript #google-apps-script

#javascript #google-приложения-скрипт

Вопрос:

Я написал автономный скрипт, развернутый как веб-приложение. Суть скрипта в том, что при нажатии на кнопку файл Google Sheet копируется в определенный каталог, затем я хочу, чтобы открылся новый файл. Мой код блокирует открытие нового файла. Части 1 и 2 в codeTest.gs работает отлично (примерно исходя из значения, связанного с нажатой кнопкой, скрипт будет искать в файле Google Sheet имя, которое нужно присвоить форме, а также местоположение, куда его нужно скопировать).

В моем коде вы заметите, что я говорю о форме, но на самом деле это файл Google Sheet (на практике файл Google Sheet — это заполняемый документ, похожий на форму).

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>
  

Я не присоединяюсь к вызываемым функциям, потому что они работают нормально. Действительно, если я использую logger.log (URL) для проверки значения переменной, определенной в строке 34 codeTest.gs он содержит URL-адрес созданного нового файла.

Интересно, почему последняя часть не работает:

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

Этот фрагмент кода отлично работает, если я использую его самостоятельно в другом месте, но не здесь. Это потому, что в одном и том же скрипте вы не можете использовать HtmlService дважды? Я ничего не смог найти об этом ограничении, но я не вижу никаких других причин.

К сожалению, я не могу поделиться с вами документами, упомянутыми в моем коде, я работаю в компании с доменом, который нельзя использовать совместно с другими учетными записями, кроме нашего.

Прошу прощения за мой английский…

Комментарии:

1. Вы можете вызывать HtmlService столько раз, сколько захотите, но doGet() будет отображать его только один раз. В вашем файле страницы вы должны включить функцию скрипта для получения и открытия URL-адреса формы. Для этого вы можете использовать метод google.script.run.withSuccessHandler().

2. @Diego: большое спасибо. Я попробую в понедельник и дам вам знать. Еще раз спасибо.

Ответ №1:

Если вы просто хотите открыть указанный URL, вы можете использовать UrlFetchApp вместо этого вот так:

 UrlFetchApp.fetch(url);
  

Ссылка

Ответ №2:

По предложению Диего я добрался до этого, и это работает :

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 звучит интересно. Я тоже наведу справки.

Спасибо!