Tập lệnh độc lập - mở tệp google sheet
Tôi đã viết một tập lệnh độc lập được triển khai như một ứng dụng web. Điểm của tập lệnh là bằng cách nhấp vào một nút, tệp Google Trang tính sẽ được sao chép vào một thư mục cụ thể, sau đó tôi muốn tệp mới mở. Mã của tôi đang chặn để mở tệp mới. Phần 1 và 2 trong codeTest.gs hoạt động hoàn hảo (gần như từ giá trị được liên kết với nút được nhấp, tập lệnh sẽ tìm trong tệp Google Trang tính để tìm tên cho biểu mẫu cũng như vị trí nơi nó phải được sao chép).
Trong mã của tôi, bạn sẽ nhận thấy rằng tôi đang nói về một biểu mẫu, nhưng nó thực sự là một tệp Google Trang tính (trong thực tế, tệp Google Trang tính là một tài liệu được điền vào tương tự như một biểu mẫu).
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>
Tôi không tham gia các chức năng được gọi vì chúng hoạt động tốt. Thật vậy, nếu tôi thực hiện một logger.log (url) để kiểm tra giá trị của biến được xác định trên dòng 34 của codeTest.gs, thì nó có chứa url của tệp mới được tạo.
Tôi tự hỏi tại sao phần cuối cùng không hoạt động:
// 3 - on ouvre le nouveau fichier créé
var url=newForm.getUrl;
var htmlString = "<script>window.open('" + url +"');</script>";
return HtmlService.createHtmlOutput(htmlString);
Đoạn mã này hoạt động tốt nếu tôi sử dụng nó ở nơi khác, nhưng không phải ở đây. Có phải vì trong cùng một tập lệnh, bạn không thể sử dụng HtmlService hai lần? Tôi không thể tìm thấy bất cứ điều gì về giới hạn này, nhưng tôi không thấy bất kỳ lý do nào khác.
Rất tiếc, tôi không thể chia sẻ các tài liệu được đề cập trong mã của tôi với bạn, tôi đang ở trong một công ty có miền không thể chia sẻ với các tài khoản không phải của chúng tôi.
Tôi xin lỗi vì tiếng anh của tôi ...
Trả lời
Nếu bạn chỉ muốn mở URL được đề cập, bạn có thể sử dụng UrlFetchAppthay thế, như sau:
UrlFetchApp.fetch(url);
Tài liệu tham khảo
- Lớp UrlFetchApp
Với gợi ý của Diego, tôi đã làm được điều này, và nó hoạt động:
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, lớp UrlFetchApp nghe có vẻ thú vị. Tôi cũng sẽ hỏi.
Cảm ơn!