【问题标题】:Standalone script - open a google sheet file独立脚本 - 打开 google sheet 文件
【发布时间】:2020-09-11 16:01:12
【问题描述】:

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

在我的代码中,您会注意到我说的是表单,但它确实是一个 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) 来检查在 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 吗?我找不到有关此限制的任何信息,但我没有看到任何其他原因。

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

对不起我的英语......

【问题讨论】:

  • 您可以根据需要多次调用 HtmlService,但它只会被 doGet() 渲染一次。在您的页面文件中,您应该包含一个脚本函数来接收和打开表单 url。您可以为此使用 google.script.run.withSuccessHandler() 方法。
  • @Diego:非常感谢。我会在星期一试试,让你知道。再次感谢。

标签: javascript google-apps-script


【解决方案1】:

如果你只是想打开上面提到的 URL,你可以改用UrlFetchApp,像这样:

UrlFetchApp.fetch(url);

参考

【讨论】:

    【解决方案2】:

    在 Diego 的建议下,我做到了,并且成功了:

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

    谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多