【发布时间】: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