独立脚本-打开Goog​​le工作表文件

时间:2020-09-11 16:01:12

标签: javascript google-apps-script

我写了一个部署为Web应用程序的独立脚本。脚本的要点是,通过单击按钮将Google表格文件复制到特定目录,然后我希望新文件打开。我的代码被阻止打开新文件。 codeTest.gs中的第1部分和第2部分运行良好(大致从与单击按钮相关联的值开始,脚本将在Google表格文件中查找要提供给表单的名称以及必须复制该文件的位置)。

在我的代码中,您会注意到我在谈论一个表单,但这确实是一个Google表格文件(实际上,Google表格文件是要填充的文档,类似于表格)。

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)检查在codeTest.gs的第34行定义的变量的值,则它确实包含创建的新文件的url。

我想知道为什么最后一部分不起作用:

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

如果我在其他地方(而不是在这里)独自使用它,则这段代码可以正常工作。是因为在同一脚本中您不能两次使用HtmlService吗?我找不到关于此限制的任何信息,但没有其他原因。

很遗憾,我无法与您共享代码中提到的文档,因为我所在的公司的域不可与我们的帐户共享。

对不起,我的英语...

2 个答案:

答案 0 :(得分:0)

如果您只想打开提到的URL,则可以改用UrlFetchApp,如下所示:

UrlFetchApp.fetch(url);

参考

答案 1 :(得分:0)

在迭戈的建议下,我明白了,它的工作原理是:

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类听起来很有趣。我也会询问。

谢谢!