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