Вызов SpreadsheetApp.getUi (). Alert (); останавливает работу сервера через google.script.run - PullRequest
0 голосов
/ 05 апреля 2019

Привет и спасибо заранее!

Я создал боковую панель в электронной таблице Google с кнопкой.Нажатие на кнопку запустит функцию сервера.Эта функция показывает окно предупреждения и вставляет текст в определенную ячейку.

Рабочий пример:

https://docs.google.com/spreadsheets/d/1Mv-0YRSJJpwSaRh_xAeZDtVqL-P-e5nS80fUJIq_CJ4/edit?usp=sharing

Теперь самое сложное: я использую этот код на другом листе, которым я не могу поделиться, потому что он содержит конфиденциальные данные.И на этом листе функция запускается только тогда, когда я удаляю или // деактивирую строку с вызовом alert ().

Я знаю, что найти такие ошибки довольно сложно, но, возможно, у кого-то есть идея, что этоможет быть?

CODE.GS

function onOpen() {
  // Add a custom menu to the spreadsheet.
  SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
  .createMenu('Custom Menu')
  .addItem('myToDoPanelLabel', 'showTestPanel')
      .addToUi();
}

function insert(value) {
  SpreadsheetApp.getUi().alert("Message"); //with this line it only works in test sheet but not in the original sheet
  var thisID="1Mv-0YRSJJpwSaRh_xAeZDtVqL-P-e5nS80fUJIq_CJ4";
  var ss = SpreadsheetApp.openById(thisID).getSheetByName("Tab1");
  ss.getRange(1,2).setValue("New Txt");

}


function showTestPanel() {
var template = HtmlService.createTemplateFromFile('panel');
  var htmlOutput = template.evaluate()
  .setTitle('ToDoPanel');
  SpreadsheetApp.getUi().showSidebar(htmlOutput); 
}

PANEL.HTML

<script>
  window.mark = function() {
   google.script.run.insert();
  };
</script>

<button onclick='mark()'>click me</button>

Редактировать: Суть проблемы в том, что диалоговое окно не отображается!При вызове alert () код останавливается (время ожидания можно увидеть в журнале сценариев «Время ожидания при ответе пользователя»).С предложенным ниже решением оно будет выполнено, но все равно не появится пользовательский диалог.Это какая-то проблема с разрешением?

1 Ответ

1 голос
/ 05 апреля 2019

Ну, .alert блокирует выполнение сервера. Цитирование:

Открывает диалоговое окно в редакторе пользователя с заданным сообщением и кнопкой «ОК». Этот метод приостанавливает серверный скрипт, пока открыто диалоговое окно. Сценарий возобновляется после того, как пользователь закрывает диалоговое окно, но соединения Jdbc и блокировки LockService не сохраняются во время приостановки.

Как они предлагают в свое руководство по диалогу , вы можете использовать пользовательский диалог:

Пользовательские диалоговые окна не приостанавливают серверный сценарий, пока диалоговое окно открыто. Компонент на стороне клиента может выполнять асинхронные вызовы сценария на стороне сервера, используя либо API google.script для интерфейсов службы HTML, либо обработчики сервера для интерфейсов службы пользовательского интерфейса.

Итак, создание собственного диалога может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...