2014-10-11 8 views
1

У меня есть следующий код внутри сценария для таблицы Google:uiInstance.close() не имеет никакого эффекта

var uiInstance; 

function displayDialog() { 
uiInstance = UiApp.createApplication() 
    .setWidth(130) 
    .setHeight(130); 
uiInstance.add(uiInstance.createLabel("foo")); 
SpreadsheetApp.getUi().showModalDialog(uiInstance, 'bar'); 
} 

Этот диалог предназначен для информирования пользователя скрипт расчетливый что-то, и я хочу, чтобы закрыть снова, как только скрипт завершит свою работу. Если я использую

uiInstance.close(); 

внутри или вне функции ничего не происходит; диалог остается открытым до тех пор, пока пользователь не закроет его. Есть ли решение для моей проблемы?

ответ

1

Вам необходимо «вернуть», чтобы эффективно закрыть uiInstance, return необходимо для отражения изменений, внесенных вами в Ui, включая его закрытие.

попробовать

return uiInstance.close(); 

EDIT следующий комментарий:

экземпляры UiApp могут быть закрыты только из функции обработчика, я подумал, что, как вы использовали его (но я мог бы были ошибочны).

Ниже приведен небольшой пример кода:

function displayDialog() { 
    var uiInstance = UiApp.createApplication() 
    .setWidth(130) 
    .setHeight(130); 
    uiInstance.add(uiInstance.createLabel("foo")); 
    var handler = uiInstance.createServerHandler('closeDialog'); 
    uiInstance.add(uiInstance.createButton('close',handler)); 
    SpreadsheetApp.getUi().showModalDialog(uiInstance, 'bar'); 
} 

function closeDialog(){ 
    return UiApp.getActiveApplication().close(); 
} 

Существует также хитрый обходной путь, который может «имитировать» действия пользователя. Он использует свойство некоторых виджетов для запуска функции обработчика при изменении значения. В приведенном ниже примере я использовал checkBox для запуска процесса

Он закроет диалог, когда будет выполнена задача doStuf.

function displayDialog() { 
    var uiInstance = UiApp.createApplication() 
    .setWidth(130) 
    .setHeight(130); 
    uiInstance.add(uiInstance.createLabel("foo")); 
    var handler = uiInstance.createServerHandler('doStuf'); 
    var chk = uiInstance.createCheckBox().setValue(true).setId('chk').setVisible(false); 
    chk.addValueChangeHandler(handler); 
    uiInstance.add(chk); 
    chk.setValue(false,true)// This actually calls the doStuf function (using the handler) 
    SpreadsheetApp.getUi().showModalDialog(uiInstance, 'bar'); 
} 

function doStuf(){ 
    Utilities.sleep(5000);// replace with something useful ... 
    return UiApp.getActiveApplication().close(); 
} 
+0

Возможно, я просто не понимаю, что вы имеете в виду, до сих пор я не могу заставить его работать; Если у меня есть функция, такая как {displayDialog(); DoStuff(); CloseDialog(); } что нужно закрытьDialog(), чтобы выглядеть? И мне нужно также изменить displayDialog()? –

+0

см. Править пожалуйста –

+0

Спасибо =)! Мне это нужно, потому что задача «doStuff» занимает довольно много времени, чтобы закончить (> 1 минута), и я хотел, чтобы пользователь знал, что (или что) он все еще работает –

0

Использование:

uiInstance = uiInstance.close(); 
SpreadsheetApp.getUi().showModalDialog(uiInstance, 'bar'); 
Смежные вопросы