首页 > 解决方案 > 查找最佳棋盘游戏的宏/脚本 - Google 电子表格

问题描述

我有一个我和我的朋友一起制作的电子表格,里面有我们的棋盘游戏收藏和每个游戏的信息(估计需要玩的时间、最少人数、最多人数等)
我想创建一个可以输入金额的页面我和我在一起的人,以及我想花在游戏上的时间。
当我按下回车键时,脚本会运行并根据我输入的玩家数量和时间给我一个符合条件的游戏列表。

这是电子表格的链接。

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

标签: google-apps-script

解决方案


前言

这是一个有趣的问题,可以迅速扩大范围。

虽然您拥有的玩家数量是一个“固定”值,但估计的时间不是。

解决方案

当您说“符合条件的游戏”时,意味着所有满足以下条件的游戏:

  • Min. Player >= your player input
  • Max. Player <= your player input
  • Est. Time <= your time input

事情变得有趣的地方

虽然这可以通过一种相当简单的方式完成,但我相信如果您根据这些游戏的“合身程度”对它们进行排名,将会对您有所帮助。

为此,您可以使用基于一些数学公式对它们进行排序的系统:

  • 由于您知道所有返回的项目最多具有您输入的估计时间,因此您可以创建一个分数形式为(currentItemTime/MaximumTime) * timeScoreWeight
    • 此外,您可以根据当时可以玩多少场游戏来更改分数,即:时间段为 1 小时,游戏 A 可以玩一次,但游戏 B 可以玩两次。如果您将玩家的评分考虑在内,这可用于根据过去的分数找到适合您情况的最佳游戏。这也会带来新的/未评级的游戏迅速跌至谷底的问题。
  • 由于您有一个平均评分指标,您还可以将其添加到公式中作为currentItemRating/5 * ratingWeight.
  • 如果您想考虑灵活的桌子大小,也就是说,您愿意在相同数量的人下同时运行两个游戏,您还可以找到存在哪些游戏组合,其中numberOfPlayer <= (x+y)x代表a number >= minPlayer and <=maxPlayer游戏 A,y代表a number >= minPlayer and <=maxPlayer游戏 B。

如果您将所有这些评分加起来,则可以按此数字排序并获得最佳游戏列表,根据您的情况从最佳到最差排序。

回到地球

虽然做梦总是好的,但我假设您希望快速完成某些事情,因此,这里有一些代码可以帮助您入门:

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) {
      //This is eligible.
      result.push(currentGame);
    }
  }
  return result;
}

希望这可以帮助!


推荐阅读