Скрипт для отображения отфильтрованного списка игр на основе введенных критериев? (Google Spreadsheet - PullRequest
1 голос
/ 22 октября 2019

https://docs.google.com/spreadsheets/d/1AFTr_ji5iz8BJU9_OkZ1Xhfb9hg9ARAaRXfdVx2Y8pU/edit?usp=sharing

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

Выше приведена копия данной таблицы, а код указан ниже:

/** @OnlyCurrentDoc */

function test() {
  var gamesThatFitCriteria = findGames(4,50);
}

function findGames(player, timeInMinutes) {
  var games = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  games.shift(); //Remove first row
  games.shift(); //Remove second row

  var result = [];

  for (var i=0; i<games.length; i++) {
    var currentGame = games[i];

    var time = currentGame[2];
    var minPlayer = currentGame[3];
    var maxPlayer = currentGame[4];

    if (time<=timeInMinutes && player >= minPlayer && player <= maxPlayer) {
      //Eligible Game
      result.push(currentGame);
    }
  }
  return result;
}

1 Ответ

1 голос
/ 22 октября 2019

Это даст вам диалоговое окно для просмотра всех результатов.

function runThis() {
  var gamesThatFitCriteria = findGames(4,50);
  var userInterface=HtmlService.createHtmlOutput(gamesThatFitCriteria.join('<br />'));
  SpreadsheetApp.getUi().showModelessDialog(userInterface, "Games")
}

function findGames(player, timeInMinutes) {
  var games=SpreadsheetApp.getActive();
  var sh=games.getActiveSheet();
  var rg=sh.getRange(3,1,sh.getLastRow(),sh.getLastColumn());
  var values=rg.getValues();
  var result = [];

  for (var i=0;i<values.length;i++) {
    var currentGame = values[i];

    var time = currentGame[2];
    var minPlayer = currentGame[3];
    var maxPlayer = currentGame[4];

    if (time<=timeInMinutes && player >= minPlayer && player <= maxPlayer) {
      result.push(currentGame);
    }
  }
  return result;
}

Если вы просто хотите, чтобы названия игр:

function runThis() {
  var gamesThatFitCriteria = findGames(4,50);
  var userInterface=HtmlService.createHtmlOutput(gamesThatFitCriteria.join('<br />'));
  SpreadsheetApp.getUi().showModelessDialog(userInterface, "Games")
}

function findGames(player, timeInMinutes) {
  var games=SpreadsheetApp.getActive();
  var sh=games.getActiveSheet();
  var rg=sh.getRange(3,1,sh.getLastRow(),sh.getLastColumn());
  var values=rg.getValues();
  var result = [];
  values.forEach(function(r){var name=r[0];var time=r[2];var minPlayer=r[3];var maxPlayer=r[4];if(time<=timeInMinutes && player >= minPlayer && player <= maxPlayer) {result.push(name);}});
  return result;
}

Вот пример полного пользовательскогодиалог, который позволяет вам ввести игроков и время и выбрать нужную игру. Вы можете перейти к функции getSelection () и сохранить выбор в любом месте с помощью функции setValue ().

Просто загрузите этот код в файл .gs и удалите другие функции с такими же именами.

function runOne() {
  var html='<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"><script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>';
  html+='<input type="text" id="player" placeholder="Players" /><br /><input type="text" id="time" placeholder="Time in minutes"><br /><input type="button" value="Get Games" onClick="getGames();" /><br /><div id="result"></div><div id="hidden" style="display:none;"><br /><select id="sel1"  class="control" style="width:150px;height:35px;margin:5px 0 5px 0;"><option value="" selected></option></select></div>';
  html+='<script>function getSelection(){var selection=document.getElementById("sel1").value;console.log("I am here");google.script.run.withSuccessHandler(function(r){google.script.host.close();}).getSelection(selection);}function getGames(){var players=document.getElementById("player").value;var minutes=document.getElementById("time").value;google.script.run.withSuccessHandler(function(rObj){updateSelect(rObj.games);document.getElementById("sel1").addEventListener("change", getSelection);$("#hidden").css("display","block");}).findGames(players,minutes);}function updateSelect(vA,id){var id=id ||"sel1";var select=document.getElementById(id);select.options.length = 0;for(var i=0;i<vA.length;i++){select.options[i]=new Option(vA[i],vA[i]);}}console.log("My Code");</script>';
  var userInterface=HtmlService.createHtmlOutput(html).setWidth(800);
  SpreadsheetApp.getUi().showModelessDialog(userInterface, "Find Games");
}

function findGames(player, timeInMinutes) {
  var games=SpreadsheetApp.getActive();
  var sh=games.getActiveSheet();
  var rg=sh.getRange(3,1,sh.getLastRow(),sh.getLastColumn());
  var values=rg.getValues();
  var result = ['Select a game'];
  values.forEach(function(r){var name=r[0];var time=r[2];var minPlayer=r[3];var maxPlayer=r[4];if(time<=timeInMinutes && player >= minPlayer && player <= maxPlayer) {result.push(name);}});
  var rObj={games:result};
  return rObj;
}

function getSelection(selection) {
  var msg=Utilities.formatString('You have selected: %s',selection);
  SpreadsheetApp.getUi().alert(msg);
  //you can put selection any where you want with setValue()
  return true;
}

Запустите функцию runOne (), чтобы открыть диалоговое окно.

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