Я следовал этому руководству: https://developers.google.com/apps-script/guides/dialogs#file-open_dialogs и я могу открыть Google Picker после нажатия кнопки на боковой панели аддона.
Я хочу сделать 2 вещи для лучшего UX для моих пользователей:
Во-первых, когда открыт Google Picker, я хочу показать загрузочный счетчик внутри боковой панели аддона (чтобы пользователи не могли взаимодействовать с боковой панелью), чтобы пользователи могли только взаимодействоватьс помощью Google Picker до его закрытия
После того, как пользователи выберут документ или напрямую закроют Google Picker, загрузочный счетчик на боковой панели аддона также исчезнет немедленно (мы не должны перезагружать боковую панель), и пользователи могут нормально взаимодействовать с боковой панелью аддона
Обратите внимание: индикатор загрузки внутри боковой панели аддона(не в диалоге выбора)
Я сделал следующее:
У меня есть 2 файла:
- sidebar.html
- picker.html
BВ этих html-файлах содержатся html, css, js, необходимые для запуска каждого из них.
Внутри sidebar.html
, когда мне нужно открыть средство выбора, я позвоню:
function openPicker() {
// Show spinner here
showSpinner()
google.script.run
.withSuccessHandler(function() { console.log('ok') })
.showPicker()
}
Выше функции вызовет эту функцию showPicker () в Code.gs
:
function showPicker() {
var html = HtmlService.createHtmlOutputFromFile('picker.html')
.setWidth(800)
.setHeight(600)
FormApp.getUi().showModalDialog(html, 'Select a file')
}
Внутри picker.html
у меня есть обратный вызов:
function pickerCallback(data) {
var action = data[google.picker.Response.ACTION]
if (action === google.picker.Action.PICKED) {
var doc = data[google.picker.Response.DOCUMENTS][0]
var id = doc[google.picker.Document.ID]
var url = doc[google.picker.Document.URL]
var title = doc[google.picker.Document.NAME]
document.getElementById('result').innerHTML =
'<b>You chose:</b><br>Name: <a href="' + url + '">' + title + '</a><br>ID: ' + id
} else if (action === google.picker.Action.CANCEL) {
google.script.host.close()
}
// This is a good place to hide the spinner,
// but this is picker.html, so it can not control code in sidebar.html to hide the spinner
}
Проблема здесь в том,sidebar.html
может знать только, когда показывать счетчик, а не когда закрывать его.
Логика определения момента, когда мы должны закрыть счетчик, находится в самом файле picker.html (только пользователь знает, когда пользовательвыбрал документ или отменил средство выбора).
И я не знаю, как передать эту логику в sidebar.html
, чтобы он мог запустить hideSpinner()
где-то внутри sidebar.html
.