如何对每列中的值求和并按 google sheet 中的值之和对每个列名称进行排名
How to sum up the values in each column and ranking each column name by sum of values in google sheet
我有一个 google sheet,其值正在填充
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
想法是:每个比赛日我都会输入比赛日期和每位球员的进球数,如果有新球员进球我会在新的列中输入他的名字和当天的进球数。如果那天有任何球员没有得分,我就会将该单元格留空。
然后我想用得分球员的排名填充第一列 "Top scorers"。预期结果将如下所示:
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
它将根据新的数据输入自动更新。我怎么能做到这一点?我查看了 Pivot Table,但似乎很难存档此结果。
根据您想要完成的内容的描述和 Google Sheet 分享。
您需要将问题分解为几个子任务:
- 选择您稍后需要的所有范围(球员、日期、您将写入分数的范围、您的最佳射手将显示的范围)
- 将每个球员在所有比赛中的进球相加得到他们的总分
- 根据总得分对选手进行排序
- 创建字符串以写入您的最佳射手列
- 将这些字符串写入topscorer列
我的解决方案非常冗长,但似乎可行。如果您有任何问题或需要说明,请随时提出。
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();
};
我有一个 google sheet,其值正在填充
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
想法是:每个比赛日我都会输入比赛日期和每位球员的进球数,如果有新球员进球我会在新的列中输入他的名字和当天的进球数。如果那天有任何球员没有得分,我就会将该单元格留空。 然后我想用得分球员的排名填充第一列 "Top scorers"。预期结果将如下所示:
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
它将根据新的数据输入自动更新。我怎么能做到这一点?我查看了 Pivot Table,但似乎很难存档此结果。
根据您想要完成的内容的描述和 Google Sheet 分享。
您需要将问题分解为几个子任务:
- 选择您稍后需要的所有范围(球员、日期、您将写入分数的范围、您的最佳射手将显示的范围)
- 将每个球员在所有比赛中的进球相加得到他们的总分
- 根据总得分对选手进行排序
- 创建字符串以写入您的最佳射手列
- 将这些字符串写入topscorer列
我的解决方案非常冗长,但似乎可行。如果您有任何问题或需要说明,请随时提出。
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();
};