#javascript #html #google-apps-script
Вопрос:
ОБНОВЛЕНИЕ: Спасибо всем за вашу помощь, особенно ale13. Я обновил вопрос окончательным кодом, который сработал для меня.
Я пытаюсь создать HTML-кнопку, которая появляется в моих таблицах Google, и по щелчку она должна инициировать загрузку листа. Я создал кнопку, и все остальное работает идеально. Когда я вручную сгенерирую ссылку и нажму на нее, файл загрузится. Однако, когда я нажимаю на кнопку, ничего не происходит.
Это код для запуска HTML.
function downloadPopup(){
var html = HtmlService.createHtmlOutputFromFile('Button');
SpreadsheetApp.getUi().showModalDialog(html, 'Download Lists as CSV');
}
Настройка и получение свойства
PropertiesService.getScriptProperties().setProperty('urlD', downloadURL);
function urlHTML(){
return PropertiesService.getScriptProperties().getProperty('urlD');
}
Это HTML
<!DOCTYPE html>
<html>
<head>
<base target="_center">
<style>
.
.
.
</style>
</head>
<script>
var downloadURL = PropertiesService.getScriptProperties().getProperty('urlD');
function downloadFile(downloadURL){
window.open(downloadURL);
}
</script>
<body>
<div id="buttonlink"></div>
<button type="button" onclick="google.script.run.withSuccessHandler(downloadFile).urlHTML()" class="button">Download CSV</button>
</body>
</html>
Большое спасибо!
Комментарии:
1. Попробуйте
<input type="button" onclick="downloadFile();" />Download CSV
добавить Logger.log() в gs.2. Купер прав
3. Спасибо, ребята, однако мне нужно оформить кнопку.
Ответ №1:
Я предлагаю вам изменить код следующим образом:
Code.gs
function downloadPopup(){
var html = HtmlService.createHtmlOutputFromFile('Button');
SpreadsheetApp.getUi().showModalDialog(html, 'Download Lists as CSV');
}
function urlHTML(){
return downloadURL;
}
Button.html
<!DOCTYPE html>
<html>
<head>
<base target="_center">
<style>
</style>
</head>
<script>
function downloadFile(downloadURL){
window.open(downloadURL, '_self');
}
</script>
<body>
<div id="buttonLink"></div>
<button type="button" onclick="google.script.run.withSuccessHandler(downloadFile).urlHTML()">Preview The Document</button>
</body>
</html>
Если вам действительно не нужны две разные функции для возврата URL-адреса, я бы посоветовал вам использовать только одну, которая будет возвращать URL-адрес непосредственно при вызове. В качестве примечания важно иметь в виду, что глобальные переменные сценария приложений отличаются от переменных в других языках программирования — каждый новый вызов функций приведет к возвращению в сценарий нового контекста без памяти о предыдущих исполнениях, если они не были сохранены. Для правильного хранения глобальной переменной я предлагаю вам взглянуть на этот класс.
Что касается HTML-части, то при нажатии на кнопку withSuccessHandler(downloadFile)
можно указать функцию обратного вызова на стороне клиента, которая будет выполняться, когда функция urlHTML()
сервера ответит. Для того, чтобы открыть ссылку в новом окне, window.open
была использована ссылка.
Ссылка
Комментарии:
1. Спасибо тебе, але13! Это сработало! Однако для открытия другой страницы и загрузки файла требуется много секунд. Когда я сделал это с помощью гиперссылки, это было очень быстро. Я также пытался воспользоваться услугой недвижимости, но она не сработала, как только я это сделал. Я создал свойство PropertiesService.getScriptProperties().setProperty(‘urlD’, downloadUrl);, затем в HTML я попытался его вызвать. Это не сработало, поэтому я создал var в HTML и использовал его в функции загрузки файла. Это тоже не сработало. У вас есть какие-нибудь советы, как быстро начать загрузку и работать с собственностью? Спасибо!
2. Вам нужно будет установить свойство с помощью
setProperty
, а затем извлечь его с помощьюgetProperty
— после этого вместо возвратаdownloadURL
переменной вы вернете только что полученное свойство 🙂 Что касается медленной загрузки файла, это может быть вызвано чем-то с вашей стороны, так как я смог быстро начать загрузку.3. Большое вам спасибо @ale13! Сейчас он работает идеально! Я немного запутался с
withSuccessHandler(downloadFile).urlHTML()
тем, как и как вставить свойство вdownloadFile()
функцию. Я не понимаю, почему мы добавляем.urlHTML()
послеwithSuccessHandler
, потому что похоже, что он ничего не делает.downloadFile()
Функция делает все. Знаете ли вы функцию, позволяющую начать загрузку, не открывая другую вкладку?4. Вы можете использовать
'_self'
атрибут сwindow.open
—window.open(downloadURL,'_self')
. Это должно мгновенно запустить загрузку, не открывая новую вкладку.5. Спасибо тебе, але13! Это сработало идеально, и работает именно так, как мне было нужно! Ты такой хороший! Спасибо!
Ответ №2:
<input type="button" value="Download CSV" onclick="downloadFile()" />
Пример кода из проекта, показывающий, как стилизовать кнопки и тому подобное
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<!-- Add CSS code to format the sidebar from google stylesheet -->
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
<style>
body {
padding: 20px;
}
</style>
</head>
<body>
<div class="block">
<input type="button" value="Get Sheet Size" onclick="getSheetSize()" />
</div>
<div class="block">
<input type="button" value="Close" onclick="google.script.host.close()" />
</div>
<div class="block">
<div id="results"></div>
</div>
<script>
function getSheetSize() {
//google.script.run.auditSheet();
//google.script.run.withSuccessHandler(displayResults).auditSheet();
google.script.run.withSuccessHandler(displayResults).auditAllSheets();
}
function displayResults(results) {
// display results in sidebar
document.getElementById("results").innerHTML = results;
}
</script>
</body>
</html>
Комментарии:
1. Спасибо, Джон, но мне нужно оформить пуговицу.
2. Используйте дивы и стили, я опубликую код из одного из своих проектов