Как суммировать значения в каждом столбце и ранжировать имя каждого столбца по сумме значений в Google листе - PullRequest
0 голосов
/ 22 января 2019

У меня есть лист 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

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

Пример листа .

1 Ответ

0 голосов
/ 27 января 2019

В соответствии с описанием того, что вы пытаетесь выполнить, и Google Sheet поделился.

Вам нужно разбить свою проблему на несколько подзадач:

  • Выбор всехдиапазоны, которые вам понадобятся позже (игроки, даты, диапазон, в котором вы будете записывать свои результаты, диапазон, в котором будут отображаться ваши лучшие бомбардиры)
  • Суммирование целей каждого игрока из всех игр, чтобы получить их общий счет
  • Сортировка игроков в соответствии с их общим счетом
  • Создание строк для записи в столбец topscorer
  • Запись этих строк в столбец topscorer

MyРешение довольно многословно, но, похоже, работает.Пожалуйста, не стесняйтесь спрашивать, если у вас есть какие-либо вопросы или необходимы разъяснения.

    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();
};
...