Как закрыть модальное диалоговое окно?

164
22 июня 2018, 08:20

Задача вывести html код в Google таблице для проигрывания музыки, и чтобы через несколько секунд этот код закрывался. Пока сделал так:
Сам скрипт

 function showDialog() {
   var html = HtmlService.createHtmlOutputFromFile('Win')
     .setWidth(4).setHeight(3);
   SpreadsheetApp.getUi().showModalDialog(html, 'Победа');
 }

Он открывает следующее модальное окно:
Win.html

<html>
<head>
  <base target="_top">
</head>
<body>
  <audio id="player" autoplay>
    <source src="http://pesochnica.tk/cut.mp3" type="audio/mpeg">
    Ваш браузер не поддерживает аудио элементы.
  </audio>
  <script type="text/javascript">
    Utilities.sleep(5000);
    google.script.host.close();
  </script>
</body>
</html>

Суть в том, что не получается реализовать паузу. Если в коде оставляю только google.script.host.close();, то окно отлично закрывается сразу после загрузки. А при попытке добавить любой из следующих вариантов приводят к тому, что оконо просто остаётся висеть.

Utilities.sleep(5000);
Thread.sleep(5000);
TimeUnit.SECONDS.sleep(5);
Answer 1

Вот так должно получиться (приблизительно):

Code.gs

function doSomething()
{
    Utilities.sleep(5000);
    Logger.log('I was called!');
}

Win.html

<html><head><base target="_top"></head>
<body>
    <audio id="player" autoplay>
        <source src="http://pesochnica.tk/cut.mp3" type="audio/mpeg">
        Ваш браузер не поддерживает аудио элементы.
    </audio>
    <script type="text/javascript">
    window.onload = function()
    {    
        google.script.run
                .withSuccessHandler(closeDialog)
                .doSomething()
    };
    window.closeDialog = function()
    {
        google.script.host.close();
    };
    </script>
</body></html>

Документация (на английском):

Class google.script.run. Client-side API

Answer 2

Если коротко, то

<script type="text/javascript">
  window.onload = function() {
    setTimeout(function() {
      google.script.host.close();
    }, 5000);
  };
</script>

В общем случае, есть два варианта решения задачи: 1) установить колбэк, который сработает после вычислений на клиенте, 2) закрыть окно после рачетов на сервере.

Вариант 1

Требует только код на клиенте. В примере используется setTimeout

  window.onload = function() {
    setTimeout(function() {
      google.script.host.close();
    }, 5000);
  };

Вариант 2

Требует код и на клиенте и на сервере. В примере используется Utilites.sleep() для отложенного действия

сервер

function setServerTimeout(milliseconds){
  Utilities.sleep(milliseconds);
}

клиент

window.onload = function() {
  google.script.run
    .withSuccessHandler(function() {
      google.script.host.close();
    })
    .setServerTimeout(5000);
};

Листинг рабочей програмы с примером https://gist.github.com/oshliaer/10ea6ecf35f17f9340906714a9f7f714

READ ALSO
call back на мобильной версии

call back на мобильной версии

Ребят, кто может сказать почему модальное окно не открывается на мобильнике?

181
IE 11 переопределение нативного метода

IE 11 переопределение нативного метода

В коде определяю свой documentwrite = function(){мой код} Затем делаю ajax запрос, ответ на этот запрос - js, который выполняется через window

219
Вложенные списки и jquery

Вложенные списки и jquery

допустим есть некий список с вложенностью

159
Задача на функции и методы. Java [закрыт]

Задача на функции и методы. Java [закрыт]

Определить, является ли массив отсортированным по возрастанию

197