Как заблокировать электронную таблицу во время работы автономного скрипта - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть электронная таблица, которая вызывает функции в автономном скрипте через триггер onEdit. Автономная функция имеет циклы и может выполнять до нескольких секунд. Если пользователь редактирует другую строку во время выполнения автономного сценария, информация из второй строки смешивается с информацией из первой строки в цикле.

код в автономном скрипте: -

var tasklistID="mytaslistid"
function getTasks() {
    var tasks=Tasks.Tasks.list(tasklistID)
    return tasks
}

Код в таблице: -

function getTasks(){
    TaskManagerScript.getTasks()
}

Установленный триггер onEdit вызывает функцию getTasks электронной таблицы, которая, в свою очередь, вызывает автономную функцию getTasks

NB. Это упрощенная версия моего кода. Актуальная версия также фильтрует задачу, чтобы извлечь задачи из определенной даты. Это включает в себя циклическое выполнение задач в списке, что занимает время

Так что мне нужен способ заблокировать электронную таблицу от редактирования, пока функция в автономном скрипте не завершит свое выполнение.

Спасибо

Ответы [ 2 ]

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

Вы можете использовать диалог modal:

Модальные диалоги не позволяют пользователю взаимодействовать с чем-либо, кроме диалога.

// Display a modal dialog box with custom HtmlService content and script
var htmlOutput = HtmlService
    .createHtmlOutput('<p>Please wait...</p>')
    .append('<script>google.script.run.withSuccessHandler(google.script.host.close).callStandaloneFunction()</script>')
    .setWidth(250)
    .setHeight(300);
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'My add-on');
0 голосов
/ 28 апреля 2019

Взяв на борт комментарий TheMaster, я пришел к работе, которая включает использование пустого цикла while. Код теперь изменен следующим образом.

В сценарии Bonded: -

function getTasks(){
    \\code to open modal dialog
    showDialog()

    \\Empty while loop with call to standalone script ==true as condition to end loop
    while(TaskManagerScript.addTask(e)==false){}

    \\code to close modal dialog
    closeDialog()

}

В автономном скрипте: -

var tasklistID="mytaslistid"
function getTasks() {
    var tasks=Tasks.Tasks.list(tasklistID)
    \\some more codes
    return true
}

Трюк

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