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

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

Моя цель — заполнить раскрывающийся список определенными критериями, а затем записать выбор пользователей и дополнительную текстовую строку в переменные, которые затем записываются в электронную таблицу.

Обновлено: мне удалось создать раскрывающийся список и заполнить его, однако выбранный ввод из раскрывающегося списка возвращается в электронную таблицу очень спорадически (он работал дважды примерно из 30 попыток).

Обновлено еще раз: если я удалю google.script.host.close(); из кода, переменная будет передана обратно в электронную таблицу. Похоже, что диалоговое окно закрывается слишком быстро, но sleep() в функции functionToRunOnFormSubmit(fromInputForm) вообще не задерживает код.

Код.js:

function fncOpenMyDialog() {
  //Open a dialog
  var htmlDlg = HtmlService.createHtmlOutputFromFile('addDeck')
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setWidth(200)
      .setHeight(150);
  SpreadsheetApp.getUi()
      .showModalDialog(htmlDlg, 'Add a New Deck');
};


function functionToRunOnFormSubmit(fromInputForm) {

Logger.log(fromInputForm);

  var ss = SpreadsheetApp.getActive();
  ss.getSheetByName("test").getRange(2, 1, 1, 1).setValue(fromInputForm);
};

addDeck.html

<!DOCTYPE html>
<html>
<body>
<form>

<select name = "Class" id = "class-selector" autofocus = "autofocus" autocorrect = "off" autocomplete = "off">

  <option value = "" selected = "selected">Class</option>

  <option value = "Druid">Druid</option>
  <option value = "Hunter">Hunter</option>
  <option value = "Mage">Mage</option>
  <option value = "Paladin">Paladin</option>
  <option value = "Priest">Priest</option>
  <option value = "Rogue">Rogue</option>
  <option value = "Shaman">Shaman</option>
  <option value = "Warlock">Warlock</option>
  <option value = "Warrior">Warrior</option>
</select>

<input type = "submit" value = "Submit" onclick = "myFunction()">
</form>
<p id = "addDeck"></p>

<script>
function myFunction() {
var x = document.getElementById("class-selector").value;
document.getElementById("addDeck").innerHTML = x;

  google.script.run
    .functionToRunOnFormSubmit(x);

  google.script.host.close();

}
</script>

</body>
</html>

Код получен в основном из Использование раскрывающегося меню HTML со скриптом Google Apps в Google Sheets, а также из Как создать раскрывающийся список в поле ввода электронной таблицы (App Script)?.

Мне все еще нужно добавить текстовую ячейку для пользовательского ввода и вернуть это значение в электронную таблицу.

Любая помощь будет принята с благодарностью, спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 153
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Вы хотите получить значение раскрывающегося списка и поместить значение на лист «тест» в активной электронной таблице.
  • Вы хотите поместить новое поле ввода текста в HTML и получить введенное значение. Затем вы хотите поместить значение вместе со значением раскрывающегося списка в электронную таблицу.

Если я правильно понимаю, как насчет этой модификации?

Модифицированный скрипт

Скрипт Google Apps:

From:
ss.getSheetByName("test").getRange(2, 1, 1, 1).setValue(fromInputForm);
To:
ss.getSheetByName("test").getRange(2, 1, 1, 2).setValues([[fromInputForm.Class, fromInputForm.sample]]);

HTML:

Есть 2 части модификации.

From:
<input type = "submit" value = "Submit" onclick = "myFunction()">
To:
<input name = "sample" type = "text"> <!-- Added -->
<input type = "submit" value = "Submit" onclick = "myFunction(this.parentNode)"> <!-- Modified -->

А также

From:
function myFunction() {
  var x = document.getElementById("class-selector").value;
  document.getElementById("addDeck").innerHTML = x;
  google.script.run
    .functionToRunOnFormSubmit(x);
  google.script.host.close();
}
To:

withSuccessHandler() используется для этого.

function myFunction(obj) { // Modified
  var x = document.getElementById("class-selector").value;
  document.getElementById("addDeck").innerHTML = x;
  google.script.run // Modified
    .withSuccessHandler(() => google.script.host.close())
    .functionToRunOnFormSubmit(obj);
}

Ссылка:

Если я неправильно понял ваш вопрос, и это не тот результат, который вы хотите, приношу свои извинения.

<3 <3 <3 ЭТО РАБОТАЕТ!!!! <3 <3 <3 СПАСИБО ОГРОМНОЕ! Ваше объяснение и то, как вы изложили код, были ИДЕАЛЬНЫМИ для меня, чтобы понять, какие изменения вы внесли. Ты удивительный! (Просматривая ваш обновленный код, я понял, что добавлю ; в конце каждой функции в code.js, которая, как я только что понял, называется code.gs) O_O

Aaron Irvine 05.04.2019 09:25

@ Аарон Ирвин Я рад, что ваша проблема была решена. И тебе спасибо.

Tanaike 05.04.2019 14:32

@Tanaike, почему ты меняешь this.parentNode на functionToRunOnFormSubmit()?

Andrew Kirna 02.08.2020 03:42

@Andrew Kirna В этом случае я думаю, что объект формы, включая введенные значения, отправляется на сторону скрипта Google Apps. Таким образом, на стороне скрипта Google Apps можно получить введенные значения. Об этом, я думаю, вы можете подтвердить причину этого, проверив журнал на functionToRunOnFormSubmit(fromInputForm). Если это не тот ответ, которого вы ожидаете, прошу прощения.

Tanaike 02.08.2020 04:23

@Tanaike, спасибо за быстрый ответ! Я получал ScriptError с отказом в доступе, но я просто исправил это, выйдя из всех своих учетных записей и войдя снова. Единственное, что я не могу заставить работать, это .withSuccessHandler(() => google.script.host.close()). Есть идеи, что я могу сделать?

Andrew Kirna 02.08.2020 05:31

@Tanaike, другими словами, как мне сказать google.script.run, что моя функция выполнена успешно?

Andrew Kirna 02.08.2020 05:33

@Andrew Kirna Спасибо за ответ. Я должен извиниться за свое слабое мастерство. Из вашего ответа я не могу понять вашу ситуацию. Я глубоко извиняюсь за это. Итак, чтобы правильно понять вашу текущую ситуацию, можете ли вы опубликовать ее как новый вопрос, включив подробную информацию для воспроизведения вашей проблемы? Таким образом, это поможет пользователям, включая меня, подумать о решении. Когда вы можете сотрудничать, чтобы решить вашу проблему, я рад.

Tanaike 02.08.2020 06:13

@Tanaike, мой скрипт теперь работает! Спасибо за ответ!

Andrew Kirna 02.08.2020 06:26

@Andrew Kirna Спасибо за ответ. Я рад, что ваша проблема была решена.

Tanaike 02.08.2020 08:50

Другие вопросы по теме