【问题标题】:How to sum up the values in each column and ranking each column name by sum of values in google sheet如何总结每列中的值并通过谷歌表中的值总和对每列名称进行排名
【发布时间】:2019-01-22 03:46:48
【问题描述】:

我有一个 google 表格,其中包含正在填充的值

  A              B                 C           D            E             F        G      H
Top scorers   Date            Player l    Player 2      Player 3     Player 4
            13 Jan 2019            1        1            1
            20 Jan 2019            2        1                         1 

这个想法是:每个比赛日我都会输入比赛日期和每个球员的进球数,如果有新球员进球,我只会在新列中输入他的名字和该日期的进球数。如果哪位球员那天没有得分,我会将该单元格留空。 然后我想用球员得分的排名填充第一列“最佳射手”。预期结果将如下所示:

     A         B                C            D            E            F        G        H
Top scorers   Date            Player l    Player 2      Player 3     Player 4
Player 1: 3   13 Jan 2019         1         1            1
Player 2: 2   20 Jan 2019         2         1                         1 
Player 3: 1
Player 4: 1

它将根据新的数据输入自动更新。我怎么能做这个?我查看了数据透视表,但似乎很难归档此结果。

Sample sheet.

【问题讨论】:

  • 已将问题更新为具有列名。这个问题很具体,也不算太宽泛!
  • 您介意分享一个包含数据结构并展示您已经尝试过的内容的 Google 表格吗?
  • 我只试过数据透视表,但它不起作用;所以我删除了它,但我可以分享谷歌表格,你能留下你的电子邮件地址吗?
  • 为了让 Stack Overflow 公开并可供其他用户访问,请专门为此目的创建一个 Google 文档,创建一个可查看的链接并将其包含在您的初始帖子中。有些人比我知识渊博,让我们给他们机会做出贡献并继续对话。
  • 是的,完成更新。

标签: google-apps-script google-sheets google-sheets-query google-sheets-formula google-sheets-macros


【解决方案1】:

根据您要完成的任务的描述和共享的 Google 表格。

您需要将问题分解为几个子任务:

  • 选择您以后需要的所有范围(球员、日期、您将在其中写入分数的范围、将显示您的最高得分者的范围)
  • 将每个玩家在所有比赛中的进球加起来得到他们的总分
  • 根据总分对玩家进行排序
  • 创建要写入最高得分者列的字符串
  • 将这些字符串写入最高分列

我的解决方案非常冗长,但似乎有效。如果您有任何问题或需要澄清,请随时提出。

    function testMe() {

    var ID = ''; // ID of your Document
    var name = ''; // Name of your sheet
    var sourceSheet = SpreadsheetApp.openById(ID); // Selects your Source Spreadsheet by its id
    var ssheet = sourceSheet.getSheetByName(name); // Selects your Source Sheet by its name

    var scoreRange = ssheet.getRange(2, 3, (sourceSheet.getLastRow() -1), (sourceSheet.getLastColumn() -2)); // Selects the range in which you will enter your scores
    var dateRange = ssheet.getRange(2,2,(sourceSheet.getLastRow() -1)); // Selects the range for which player names in row 1
    var playerRange = ssheet.getRange(1,3,1,(sourceSheet.getLastColumn() -2)); // selects the range for which dates were entered in column
    var topScorerRange = ssheet.getRange(2,1,scoreRange.getNumColumns()); // selects the range where your topscorer output will end up

    var numberOfPlayers = playerRange.getNumColumns(); // Gets the number of players you've already entered in row 1
    var numberOfGames = playerRange.getNumRows(); // Gets the number of games whose dates you've already entered in Column B


    function sortAndUpdateTopScorers() {
        var array = scoreRange.getValues();
        var totalPlayers = scoreRange.getNumColumns();
        var totalGames = scoreRange.getNumRows();
        var playerScores = [];

      // iterate through the scoreRange and count up each players total score

           for (var i = 0; i < totalPlayers; i++) {
               var currentPlayer = 0;
               for (var j = 0; j < totalGames; j++) {
                  currentPlayer += array[j][i];
               }
             playerScores.push([currentPlayer]);
           }

      // Combine the names of the players and their total score in order to create the strings for your topscorers column

      for (var v = 0; v < numberOfPlayers; v++) {
        playerScores[v].push(playerRange.getValues()[0][v] + ": " + playerScores[v]);
      };

      // Sort those strings according to their score

      playerScores.sort(function(a,b) {
      return b[0]-a[0]
      });

      // Remove the score value so only the string remains in the array

      for (var x = 0; x < playerScores.length; x++) {
       playerScores[x].shift(); 
      }

      // Write the content of the array into your topscorers column

      topScorerRange.setValues(playerScores);

     };
sortAndUpdateTopScorers();
};

【讨论】:

  • 我认为列中单元格的总和有一些问题。如果我添加日期:“2019 年 1 月 27 日”和当天的另一个玩家得分(玩家 5)。然后结果开始得到一些奇怪的值。详情请查看表格。第二个问题是:我们可以让这个脚本在单元格值的变化上运行,所以我们不需要不时运行它吗?
  • 您对此有何评论?
  • 对不起,我出差了。我会在接下来的几天里研究它。
  • 对不起,我出差了。我会在接下来的几天里研究它。
  • 没关系,我发现了问题并进行了 4 处更改: 1) 我编写了一个函数来获取第二列(日期列)中的行数,而不是“getLastRow”,这有助于避免当有很多玩家并且排名列将是具有最多行号的列而不是初始示例中的日期列时会出错。 2) 强制 array[j][i] 为数字而不是字符串,这也会导致计算错误 3) 而不是“sourceSheet”我对所有 getLastColumn() 和 getLastRow() 使用“ssheet”以避免从其他床单。 4) 实时运行:Edit\Current project trigger 上的事件触发
猜你喜欢
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多