Динамическое заполнение HTML-кода данными из моей электронной таблицы - PullRequest
0 голосов
/ 06 апреля 2019

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

Я попробовал «обратную разработку» кода, который у меня есть для добавления элементов в набор данных, но я впервые углубился в добавление диалоговых окон HTML в свою электронную таблицу, и поэтому я очень стараюсь понять, как он взаимодействует с файлом сценария .gs. Я искал потенциально важные вопросы о переполнении стека, но нашел только тот, который показался мне подходящим.

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

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

В идеале раскрывающийся список параметров должен отображаться в существующем диалоговом окне, созданном из файла removeDeckSelectRegion.html, но я не уверен, как это сделать. Первое диалоговое окно не закрывается, а второе не открывается в данный момент.

Демо-таблица

Код и HTML для добавления колод (работает нормально)

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


function functionToRunOnFormSubmit(fromInputForm) {
  var decks = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Decks");

  for (var i = 4; i >= 1; i++) {
    if (decks.getRange(i, 1).getValue() == "") {
      break
    }
  }
  decks.getRange(i, 1, 1, 2).setValues([[fromInputForm.Class, fromInputForm.Archetype]]);
}

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 name="Archetype" type="text">

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

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

Код для удаления колод (не работает)

function removeDeck() {
  //Open a dialog
  var htmlDlg = HtmlService.createHtmlOutputFromFile('removeDeckSelectRegion')
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setWidth(180)
      .setHeight(150);
  SpreadsheetApp.getUi().showModalDialog(htmlDlg, 'Select Region');
}


function functionToRunToRemoveDeckSelectRegion(fromInputForm) {
  var decks   = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Decks");
  var lastRow = decks.getLastRow();

  if (fromInputForm.Region == "Americas") {
    var existingDecks = decks.getRange(4, 2, lastRow-3, 1).getValues();
  }

  Logger.log(existingDecks);
  Logger.log("-----------");

  for (var i = 0; i < existingDecks.length; i++) {
    Logger.log(existingDecks[i][0]);
  }

  var htmlDlg2 = HtmlService.createHtmlOutputFromFile('removeDeck')
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setWidth(180)
      .setHeight(150);
  SpreadsheetApp.getUi().showModalDialog(htmlDlg, 'Select Deck');
}

removeDeckSelectRegion.html

<!DOCTYPE html>
<html>
<body>
<form>
  <select name="Region" id="region-selector" autofocus="autofocus" autocorrect="off" autocomplete="off">
    <option value="" selected="selected">Region</option>
    <option value="Americas">Americas</option>
    <option value="Europe">Europe</option>
    <option value="Asia">Asia</option>
  </select>

  <input type="submit" value="Submit" onclick="removeDeckSelectRegion(this.parentNode)">
</form>
<p id="removeDeckSelectRegion"></p>

<script>
function removeDeckSelectRegion(obj) {
  var x = document.getElementById("region-selector").value;
  google.script.run
    .withSuccessHandler(() => google.script.host.close())
    .functionToRunToRemoveDeckSelectRegion(obj);
}
</script>
</body>
</html>

removeDeck.html

<!DOCTYPE html>
<html>
<body>
<form>
  <select name="Deck" id="deck-selector" autofocus="autofocus" autocorrect="off" autocomplete="off">
    <option value="" selected="selected">Deck</option>
    <option value="<? existingDecks[1][0] ?>"><? existingDecks[1][0] ?></option>
    <option value="<? existingDecks[2][0] ?>"><? existingDecks[2][0] ?></option>
    <option value="<? existingDecks[3][0] ?>"><? existingDecks[3][0] ?></option>
  </select>

  <input type="submit" value="Submit" onclick="removeDeck(this.parentNode)">
</form>
<p id="removeDeck"></p>

<script>
function removeDeck(obj) {
  var x = document.getElementById("deck-selector").value;
  google.script.run
    .withSuccessHandler(() => google.script.host.close())
    .functionToRunToRemoveDeck(obj);
}
</script>

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