Скрипт Google Apps, приоритет между onclick и href - PullRequest
0 голосов
/ 06 января 2020

У меня есть кнопка (в HTML), которая одновременно вызывает функцию LoginInfoInput(...) и перенаправляет на страницу (href="..."), то есть:

<a onclick="LoginInfoInput('<?!= userID; ?>')" href="<?= ScriptApp.getService().getUrl(); ?>?v=form&userID=<?!= userID; ?>" class="waves-effect waves-light btn-large">Log In</a>,

, где LoginInfoInput(...) - это функция javascript, которая запускает мою функцию скрипта Google Apps (GS). После этого активированная функция GS вставит данные в мою таблицу. Между тем, перенаправленный URL пройдет через мою функцию doGet(). Чтобы определить результат, он получает данные из моей таблицы. Моя проблема в том, что электронная таблица не всегда обновляется вовремя, прежде чем перенаправление страницы предпринимает какие-либо действия.

Моя попытка решить эту проблему состояла в том, чтобы подождать / сделать паузу с помощью while-l oop. Однако, когда while-l oop активен, во время которого данные становятся доступными в электронной таблице (по крайней мере, визуально), не работает, т. Е. Интересные данные не доступны. Обратите внимание, я также во время while-l oop добавил возможность обновлять переменную, в которой хранятся данные электронной таблицы (вызывая SpreadsheetApp.openByUrl (url)), однако, без каких-либо улучшений.

Обновление

Мой LoginInfoInput()JavaScript) выглядит следующим образом:

function LoginInfoInput(userID){
  var userLO = document.getElementById("id_loginLO").value;
  var userPassword = document.getElementById("id_password").value;

  google.script.run.LoginAdd(userLO, userPassword, userID); 
}

Решение

Мое решение состояло из комбинации ответа, предоставленного @IMTheNachoMan , см. Ниже , и моего открытия о том, что добавление данных в GS в электронную таблицу может быть отложено, если не принудительно обновлять данные. Для принудительного обновления выполните один вызов SpreadsheetApp.flush(); link после вставки данных в электронную таблицу в функции GS. Насколько я понимаю, данные должны быть в моей электронной таблице, прежде чем я изменю свою страницу на основе (GS), поскольку она будет пытаться получить доступ к электронной таблице во время вызова моей страницы на основе (GS), а не когда я буду вызывать свою электронную таблицу когда данные доступны (при ожидании / использовании while-l oop).

1 Ответ

1 голос
/ 08 января 2020

Замените ваш <a... следующим:

<a onclick="return LoginInfoInput(this, '<?!= userID; ?>');" href="<?= ScriptApp.getService().getUrl(); ?>?v=form&userID=<?!= userID; ?>" class="waves-effect waves-light btn-large">Log In</a>

Замените свою функцию следующим:

function LoginInfoInput(a, userID)
{
    if(a.className == "done")
    {
        return true;
    }
    else
    {
        google.script.run.withSuccessHandler(function(){
            a.className = "done";
            a.click();
        }).LoginAdd();
    }
}

Когда пользователь нажимает ссылку, className не done поэтому он вызывает вашу функцию GAS и возвращает false, поэтому href не открывается. Когда функция GAS выполнена, она устанавливает className, а затем снова устанавливает ссылку. На этот раз он возвращает true, поэтому href будет запущен.

Имеет ли это смысл?

Обратите внимание, вы также можете использовать withUserObject для передачи URL-адреса из a.

Ссылка: https://developers.google.com/apps-script/guides/html/reference/run

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