Функции выполняются не так, как задумано. Я ожидаю, что страница переключится на «установку», но этого не происходит - PullRequest
0 голосов
/ 25 марта 2020

Я создаю основную c функцию входа в систему на GAS HTML. В моем HTML у меня есть форма, которая собирает и хранит пользовательский ввод с назначенными переменными (fn, ln, em, pw). Затем он отправляет информацию на лист (в котором есть формулы для проверки учетных данных), а затем в определенной ячейке («E2») будет отображаться «Найдено» или «Не найдено». Затем он напечатает имя в ячейке ('E1'), если оператор if ложен. Эта часть выполняется правильно, но 2 функции render('setup') и notFound() не будут выполняться (независимо от того, является ли оператор if истинным или ложным, ни одна из них не работает.

Я знаю render('setup') Функция отлично работает в doGet и при вызове других функций.

function signIn(fn,ln,em,pw) {

  var url = 'www.somelink.com'
  var ss = SpreadsheetApp.openByUrl(url);
  var login = ss.getSheetByName('login');
  var fname = login.getRange('F1');
  var lname = login.getRange('G1');
  var email = login.getRange('H1');
  var pword = login.getRange('I1');

  fname.setValue(fn);
  lname.setValue(ln);
  email.setValue(em);
  pword.setValue(pw);

  var check = login.getRange('E2').getDisplayValue();
  var name = login.getRange('F2').getDisplayValue();

  if (check === "Not Found"){  
  return notFound(); // THIS DOESN'T EXECUTE
  } else {
  login.getRange('E1').setValue(name);
  return render('setup'); // AND THIS DOESN'T EXECUTE
  }
}

РЕДАКТИРОВАТЬ: HTML для вызова signIn функции.

  <div class="button" align="center">
        <button id="submit" class="btn waves-effect waves-light" onclick="var fn = document.getElementById('first_name').value;
          var ln = document.getElementById('last_name').value;
          var em = document.getElementById('email').value;
          var pw = document.getElementById('password').value;
          google.script.run.signIn(fn,ln,em,pw)">Submit
    <i class="material-icons right">send</i>
    </button>

1 Ответ

1 голос
/ 26 марта 2020

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

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

Вместо этого можно сделать следующее:

  • Вместо возврата функции (например, render или notFound), вернуть параметр, который можно использовать на стороне клиента. Например, вы могли бы сделать:
function signIn(fn,ln,em,pw) {
  // Rest of your code
  if (check === "Not Found") {  
    return "notFound";
  } else {
    return "setup";
  }
}
  • Ваша клиентская функция (которую я назвал callSignIn) может затем передать этот возвращенный параметр другой функции с именем redirect , благодаря withSuccessHandler (функция) (этот обработчик необходим, поскольку google.script.run.signIn(fn,ln,em,pw) сам по себе всегда будет возвращать void):
function callSignIn() {
  var fn = document.getElementById('first_name').value;
  // Rest of your code
  google.script.run.withSuccessHandler(refresh).signIn(fn,ln,em,pw);
}
  • Затем значение, возвращаемое signIn, передается в качестве аргумента функции refresh, которая обновляет веб-приложение с помощью window.open , если аргумент равен setup, все время Передав setup в качестве параметра запроса (pageRedirect), который впоследствии может использоваться event parameter (вы можете динамически получать URL-адрес веб-приложения со стороны сервера, а не писать его вручную - см. этот ответ ):
function refresh(redirectPage) {
  if (redirectPage === "setup") {
    window.open("https://script.google.com/macros/s/{your-web-app-id}/exec?pageRedirect=" + redirectPage, "_top");
  } else {
    // Whatever you want to do if "notFound"
  }
}
  • Наконец, на стороне сервера функция doGet вызывается по запросу GET от window.open. Эта функция может проверять наличие параметра запроса в запросе через e.parameter, благодаря объекту события , и отображать другую страницу в зависимости от этого параметра:
function doGet(e) {
  if (!e.parameter.pageRedirect) {
    return HtmlService.createHtmlOutputFromFile("index");
  } else {
    return HtmlService.createHtmlOutputFromFile(e.parameter.pageRedirect)
  }
}

Ссылка:

...