OS2.spielbericht: Unterschied zwischen den Versionen

Aus Online-Soccer-Wiki
Zur Navigation springen Zur Suche springen
(Ersterstellung)
 
(Installations- und Ansichtslink auf GitHub)
 
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Kategorie:Greasemonkey]]
[[Kategorie:Greasemonkey]]
[[Kategorie:Greasemonkey WE]]
{| style="background-color:white; font-size:11px; float: right; margin:3px 3px 3px 10px; border:1px solid #999; border-color: #9C1818; border-collapse:collapse;" width=500 cellpadding=3 cellspacing=0
{| style="background-color:white; font-size:11px; float: right; margin:3px 3px 3px 10px; border:1px solid #999; border-color: #9C1818; border-collapse:collapse;" width=500 cellpadding=3 cellspacing=0
| colspan="2" style="padding:0.3em; background-color:#9C1818; font-size: 18px; color:#FFFFFF" align=center| '''OS2.spielbericht'''
| colspan="2" style="padding:0.3em; background-color:#9C1818; font-size: 18px; color:#FFFFFF" align=center| '''OS2.spielbericht'''
Zeile 7: Zeile 8:
|- bgcolor="#FFCC00"
|- bgcolor="#FFCC00"
| '''Version'''
| '''Version'''
| '''0.1'''
| '''1.0 (WebExtensions)'''
|- bgcolor="#FFCC00"
|- bgcolor="#FFCC00"
| '''Autor'''
| '''Autor'''
Zeile 13: Zeile 14:
|- bgcolor="#FFCC00"
|- bgcolor="#FFCC00"
| '''Beschreibung'''
| '''Beschreibung'''
| '''Ergänzt Summen- und Durchschnittswerte bei den Spielerstatistiken'''
| '''Ergänzt Summen- und Durchschnittswerte (nur Zweikampf) bei den Spielerstatistiken'''
|- bgcolor="#FFCC00"
|- bgcolor="#FFCC00"
| '''Webseiten'''
| '''Webseiten'''
Zeile 25: Zeile 26:
|- bgcolor="#FFCC00"
|- bgcolor="#FFCC00"
|}
|}
== [https://github.com/Eselce/OS2.scripts/blob/master/OS2.spielbericht.user.js Quellcode] [https://eselce.github.io/OS2.scripts/OS2.spielbericht.user.js INSTALLATION] ==
== Version 1.0 ==
=== Hinweise ===
Da der Praxistest gezeigt hat, dass die Durchschnittswerte zu den Spielerstatistiken von eher untergeordnetem Interesse sind, wurden diese entfernt. Es wird nur mehr der durchschnittliche Zweikampferfolg berechnet.
=== [https://github.com/Eselce/OS2.scripts/blob/master/versions/OS2.spielbericht/OS2.spielbericht-1.0.user.js Quellcode] [https://eselce.github.io/OS2.scripts/versions/OS2.spielbericht/OS2.spielbericht-1.0.user.js INSTALLATION] ===
<pre>
// ==UserScript==
// @name        OS2.spielbericht
// @namespace    http://os.ongapo.com/
// @version      1.0-SLC-WE
// @copyright    2013+
// @author      Andreas Eckes (Strindheim BK)
// @description  OS 2.0 - Ergänzt Summen- und Durchschnittswerte bei den Spielerstatistiken im Spielbericht
// @include      /^https?://(www\.)?(os\.ongapo\.com|online-soccer\.eu|os-zeitungen\.com)/rep/saison/\d+/\d+/\d+-\d+.html$/
// @grant        none
// ==/UserScript==
var borderString = "solid white 1px";
var playerStatistics = document.getElementsByTagName("table")[4];
var offsetsHorizontal = new Array(0, 0); // Linien in gesamter Breite zeichnen
var offsetsVertical = new Array(1, 2); // 1 Titel-Zeile und die 2 neuen Zeilen auslassen
// Die einfach zu berechnenden Spalten als Array
// ZK-% werden mit Summenprodukt-Funktion berechnet (3 = Index ZK% Heim, 14 = Index ZK% Auswaerts)
var simpleCols = new Array(2, 4, 5, 6, 7, 9, 10, 11, 12, 13);
var colsZkH = new Array(2, 3); // ZK und ZK-% Heim-Mannschaft
var colsZkA = new Array(13, 14); // ZK und ZK-% Auswaerts-Mannschaft
// Neue Zeilen
var sumRow = playerStatistics.insertRow(-1); // Summenzeile
var avgRow = playerStatistics.insertRow(-1); // Durchschnittszeile
// Zellen in den neuen Zeilen erzeugen
inflateRow(sumRow, playerStatistics.rows[0].cells.length);
inflateRow(avgRow, playerStatistics.rows[0].cells.length);
// Zeilenbeschriftung einfuegen
sumRow.cells[0].textContent = "Summe";
sumRow.cells[sumRow.cells.length - 1].textContent = "Summe";
avgRow.cells[0].textContent = "Durchschnitt";
avgRow.cells[avgRow.cells.length - 1].textContent = "Durchschnitt";
// Summe und Durchschnitt der "einfachen" Spalten berechnen und eintragen
var colIdx = 0;
var nonEmptyCellCount = 0;
var sumValue = 0;
var avgValue = 0.00;
for (var i = 0; i < simpleCols.length; i++) {
colIdx = simpleCols[i];
nonEmptyCellCount = getNonEmptyCellCount(playerStatistics, colIdx, offsetsVertical);
// Summe
sumValue = getColSum(playerStatistics, colIdx, offsetsVertical);
sumRow.cells[colIdx].textContent = sumValue;
// Durchschnitt
avgValue = getColAvg(playerStatistics, colIdx, offsetsVertical);
//avgRow.cells[colIdx].textContent = avgValue.toFixed(2);
}
// Durchschnitt der ZK-%-Spalten berechnen und eintragen
// Dazu die Zahl der gewonnenen Zweikaempfe berechnen und summieren und das Verhaeltnis zur Zahl der Zweikaempfe insgesamt bilden
var numberOfDuels = 0;
var numberOfDuelsWon = 0;
// Heim
numberOfDuels = getColSum(playerStatistics, colsZkH[0], offsetsVertical);
numberOfDuelsWon = Math.round(getColSumProduct(playerStatistics, colsZkH, offsetsVertical, true) / 100);
avgRow.cells[colsZkH[1]].textContent = (numberOfDuelsWon / numberOfDuels * 100).toFixed(2);
// Auswaerts
numberOfDuels = getColSum(playerStatistics, colsZkA[0], offsetsVertical);
numberOfDuelsWon = Math.round(getColSumProduct(playerStatistics, colsZkA, offsetsVertical, true) / 100);
avgRow.cells[colsZkA[1]].textContent = (numberOfDuelsWon / numberOfDuels * 100).toFixed(2);;
// Linien zeichnen
drawHorizontalLine(playerStatistics, 0, offsetsHorizontal);
drawHorizontalLine(playerStatistics, playerStatistics.rows.length - 1 - offsetsVertical[1], offsetsHorizontal);
// **************************************************************************************
// Hilfsfunktionen
// **************************************************************************************
// Erzeugt die uebergebene Anzahl von Zellen in der uebergebenen Zeile.
// row: Zeile, die aufgepumpt werden soll
// length: Anzahl der zu erzeugenden Zellen
function inflateRow(row, length) {
for (var i = 0; i < length; i++) {
row.insertCell(-1);
}
}
// Liefert die Anzahl nichtleerer Zellen einer Spalte.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, die inspiziert werden soll
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getNonEmptyCellCount(table, col, offsets) {
var returnValue = 0;
for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
if (table.rows[i].cells[col].textContent != "") { returnValue += 1; }
}
return returnValue;
}
// Liefert das Summenprodukt (wie in der Excel-Formel) von Spalten einer Tabelle.
// table: Tabelle, in der die fraglichen Spalten sind
// cols: Feld mit den Indizes der Spalten, deren Werte zeilenweise multipliziert werden sollen
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
// round: Ob jeder Summand kaufmaennisch auf Ganzzahl gerundet werden soll
function getColSumProduct(table, cols, offsets, round) {
var returnValue = 0;
var product = 1;
for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
product = 1;
for (var j = 0; j < cols.length; j++) {
product *= stringToNumber(table.rows[i].cells[cols[j]].textContent);
}
if (round) { returnValue += Math.round(product); }
else { returnValue += product; }
}
return returnValue;
}
// Liefert die Summe der Werte einer Spalte.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, deren Werte summiert werden sollen
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getColSum(table, col, offsets) {
var returnValue = 0;
for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
returnValue += stringToNumber(table.rows[i].cells[col].textContent);
}
return returnValue;
}
// Liefert den Mittelwert der Werte einer Spalte. Leere Zellen werden ignoriert.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, deren Mittelwert berechnet werden soll
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getColAvg(table, col, offsets) {
var returnValue = 0.0;
var countValues = 0;
var cellContent = "";
for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
cellContent = table.rows[i].cells[col].textContent;
if (cellContent != "") {
returnValue += stringToNumber(cellContent);
countValues += 1;
}
}
if (countValues != 0) { return returnValue / countValues; }
else { return ""; }
}
// Zeichnet eine horizontale Linie in eine Tabelle.
// table: Tabelle, in der die Linie gezeichnet werden soll
// row: Index der Zeile, unterhalb derer die Linie gezeichnet werden soll
// offsets[0]/[1]: Anzahl Spalten links/rechts, in denen keine Linie gezeichnet werden soll
function drawHorizontalLine(table, rowIdx, offsets) {
var row = table.rows[rowIdx];
for (var i = offsets[0]; i < row.cells.length - offsets[1]; i++) {
row.cells[i].style.borderBottom = borderString;
}
}
// Wandelt einen String in eine Zahl um.
// Prozentzahlen-Strings werden als Zahl interpretiert (d.h. "100%" -> 1).
// Ganze Zahlen mit Tausenderpunkten werden erkannt, wenn sie mit "." gefolgt von 3 Ziffern enden.
// Dezimalzahlen werden erkannt, wenn sie mit "." gefolgt von beliebig vielen Ziffern enden.
// Da zuerst auf ganze Zahlen geprueft wird, koennen Dezimalzahlen nicht 3 Nachkommaziffern haben.
function stringToNumber(string) {
// parseXXX interpretiert einen Punkt immer als Dezimaltrennzeichen
var returnValue = "";
var percent = false;
// Buchstaben und Whitespaces entfernen
string = string.replace(/[\sa-zA-Z]/g, "");
// Auf % pruefen und % entfernen
if (string.lastIndexOf("%") != -1) {
percent = true;
string = string.replace(/%/g, "");
}
var regexpWholeSimple = /^\d+$/;
var regexpWholeWithDots = /^\d+(\.\d{3}){1,}$/;
var regexpDecimal = /^\d*\.\d{1,}$/;
if (regexpWholeSimple.test(string)) {
// Einfache ganze Zahl
returnValue = parseInt(string);
} else if (regexpWholeWithDots.test(string)) {
// Ganze Zahl mit Tausenderpunkten
returnValue = parseInt(string.replace(/\./g, ""));
} else if (regexpDecimal.test(string)) {
// Dezimalzahl mit Punkt als Trennzeichen
returnValue = parseFloat(string);
} else {
// Kein gueltiger String
percent = false;
returnValue = "";
}
if (percent) { returnValue /= 100; }
return returnValue;
}
</pre>
<!-- Vor Umstellung auf Greasemonkey 4.0/Firefox 57.0 Quantum mit WebExtensions
<pre>
// ==UserScript==
// @name OS2.spielbericht
// @version 1.0
// @description OS 2.0 - Ergänzt Summen- und Durchschnittswerte bei den Spielerstatistiken im Spielbericht
// @include http://os.ongapo.com/rep/saison/*
// @include http://online-soccer.eu/rep/saison/*
// @include http://www.online-soccer.eu/rep/saison/*
// @grant none
// ==/UserScript==
var borderString = "solid white 1px";
var playerStatistics = document.getElementsByTagName("table")[4];
var offsetsHorizontal = new Array(0, 0); // Linien in gesamter Breite zeichnen
var offsetsVertical = new Array(1, 2); // 1 Titel-Zeile und die 2 neuen Zeilen auslassen
// Die einfach zu berechnenden Spalten als Array
// ZK-% werden mit Summenprodukt-Funktion berechnet (3 = Index ZK% Heim, 14 = Index ZK% Auswaerts)
var simpleCols = new Array(2, 4, 5, 6, 7, 9, 10, 11, 12, 13);
var colsZkH = new Array(2, 3); // ZK und ZK-% Heim-Mannschaft
var colsZkA = new Array(13, 14); // ZK und ZK-% Auswaerts-Mannschaft
// Neue Zeilen
var sumRow = playerStatistics.insertRow(-1); // Summenzeile
var avgRow = playerStatistics.insertRow(-1); // Durchschnittszeile
// Zellen in den neuen Zeilen erzeugen
inflateRow(sumRow, playerStatistics.rows[0].cells.length);
inflateRow(avgRow, playerStatistics.rows[0].cells.length);
// Zeilenbeschriftung einfuegen
sumRow.cells[0].textContent = "Summe";
sumRow.cells[sumRow.cells.length - 1].textContent = "Summe";
avgRow.cells[0].textContent = "Durchschnitt";
avgRow.cells[avgRow.cells.length - 1].textContent = "Durchschnitt";
// Summe und Durchschnitt der "einfachen" Spalten berechnen und eintragen
var colIdx = 0;
var nonEmptyCellCount = 0;
var sumValue = 0;
var avgValue = 0.00;
for (var i = 0; i < simpleCols.length; i++) {
colIdx = simpleCols[i];
nonEmptyCellCount = getNonEmptyCellCount(playerStatistics, colIdx, offsetsVertical);
// Summe
sumValue = getColSum(playerStatistics, colIdx, offsetsVertical);
sumRow.cells[colIdx].textContent = sumValue;
// Durchschnitt
avgValue = getColAvg(playerStatistics, colIdx, offsetsVertical);
//avgRow.cells[colIdx].textContent = avgValue.toFixed(2);
}
// Durchschnitt der ZK-%-Spalten berechnen und eintragen
// Dazu die Zahl der gewonnenen Zweikaempfe berechnen und summieren und das Verhaeltnis zur Zahl der Zweikaempfe insgesamt bilden
var numberOfDuels = 0;
var numberOfDuelsWon = 0;
// Heim
numberOfDuels = getColSum(playerStatistics, colsZkH[0], offsetsVertical);
numberOfDuelsWon = Math.round(getColSumProduct(playerStatistics, colsZkH, offsetsVertical, true) / 100);
avgRow.cells[colsZkH[1]].textContent = (numberOfDuelsWon / numberOfDuels * 100).toFixed(2);
// Auswaerts
numberOfDuels = getColSum(playerStatistics, colsZkA[0], offsetsVertical);
numberOfDuelsWon = Math.round(getColSumProduct(playerStatistics, colsZkA, offsetsVertical, true) / 100);
avgRow.cells[colsZkA[1]].textContent = (numberOfDuelsWon / numberOfDuels * 100).toFixed(2);;
// Linien zeichnen
drawHorizontalLine(playerStatistics, 0, offsetsHorizontal);
drawHorizontalLine(playerStatistics, playerStatistics.rows.length - 1 - offsetsVertical[1], offsetsHorizontal);
// **************************************************************************************
// Hilfsfunktionen
// **************************************************************************************
// Erzeugt die uebergebene Anzahl von Zellen in der uebergebenen Zeile.
// row: Zeile, die aufgepumpt werden soll
// length: Anzahl der zu erzeugenden Zellen
function inflateRow(row, length) {
for (var i = 0; i < length; i++) {
row.insertCell(-1);
}
}
// Liefert die Anzahl nichtleerer Zellen einer Spalte.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, die inspiziert werden soll
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getNonEmptyCellCount(table, col, offsets) {
var returnValue = 0;
for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
if (table.rows[i].cells[col].textContent != "") { returnValue += 1; }
}
return returnValue;
}
// Liefert das Summenprodukt (wie in der Excel-Formel) von Spalten einer Tabelle.
// table: Tabelle, in der die fraglichen Spalten sind
// cols: Feld mit den Indizes der Spalten, deren Werte zeilenweise multipliziert werden sollen
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
// round: Ob jeder Summand kaufmaennisch auf Ganzzahl gerundet werden soll
function getColSumProduct(table, cols, offsets, round) {
var returnValue = 0;
var product = 1;
for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
product = 1;
for (var j = 0; j < cols.length; j++) {
product *= stringToNumber(table.rows[i].cells[cols[j]].textContent);
}
if (round) { returnValue += Math.round(product); }
else { returnValue += product; }
}
return returnValue;
}
// Liefert die Summe der Werte einer Spalte.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, deren Werte summiert werden sollen
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getColSum(table, col, offsets) {
var returnValue = 0;
for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
returnValue += stringToNumber(table.rows[i].cells[col].textContent);
}
return returnValue;
}
// Liefert den Mittelwert der Werte einer Spalte. Leere Zellen werden ignoriert.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, deren Mittelwert berechnet werden soll
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getColAvg(table, col, offsets) {
var returnValue = 0.0;
var countValues = 0;
var cellContent = "";
for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
cellContent = table.rows[i].cells[col].textContent;
if (cellContent != "") {
returnValue += stringToNumber(cellContent);
countValues += 1;
}
}
if (countValues != 0) { return returnValue / countValues; }
else { return ""; }
}
// Zeichnet eine horizontale Linie in eine Tabelle.
// table: Tabelle, in der die Linie gezeichnet werden soll
// row: Index der Zeile, unterhalb derer die Linie gezeichnet werden soll
// offsets[0]/[1]: Anzahl Spalten links/rechts, in denen keine Linie gezeichnet werden soll
function drawHorizontalLine(table, rowIdx, offsets) {
var row = table.rows[rowIdx];
for (var i = offsets[0]; i < row.cells.length - offsets[1]; i++) {
row.cells[i].style.borderBottom = borderString;
}
}
// Wandelt einen String in eine Zahl um.
// Prozentzahlen-Strings werden als Zahl interpretiert (d.h. "100%" -> 1).
// Ganze Zahlen mit Tausenderpunkten werden erkannt, wenn sie mit "." gefolgt von 3 Ziffern enden.
// Dezimalzahlen werden erkannt, wenn sie mit "." gefolgt von beliebig vielen Ziffern enden.
// Da zuerst auf ganze Zahlen geprueft wird, koennen Dezimalzahlen nicht 3 Nachkommaziffern haben.
function stringToNumber(string) {
// parseXXX interpretiert einen Punkt immer als Dezimaltrennzeichen
var returnValue = "";
var percent = false;
// Buchstaben und Whitespaces entfernen
string = string.replace(/[\sa-zA-Z]/g, "");
// Auf % pruefen und % entfernen
if (string.lastIndexOf("%") != -1) {
percent = true;
string = string.replace(/%/g, "");
}
var regexpWholeSimple = /^\d+$/;
var regexpWholeWithDots = /^\d+(\.\d{3}){1,}$/;
var regexpDecimal = /^\d*\.\d{1,}$/;
if (regexpWholeSimple.test(string)) {
// Einfache ganze Zahl
returnValue = parseInt(string);
} else if (regexpWholeWithDots.test(string)) {
// Ganze Zahl mit Tausenderpunkten
returnValue = parseInt(string.replace(/\./g, ""));
} else if (regexpDecimal.test(string)) {
// Dezimalzahl mit Punkt als Trennzeichen
returnValue = parseFloat(string);
} else {
// Kein gueltiger String
percent = false;
returnValue = "";
}
if (percent) { returnValue /= 100; }
return returnValue;
}
</pre>-->
== Version 0.1 ==
=== [https://github.com/Eselce/OS2.scripts/blob/master/versions/OS2.spielbericht/OS2.spielbericht-0.1.user.js Quellcode] [https://eselce.github.io/OS2.scripts/versions/OS2.spielbericht/OS2.spielbericht-0.1.user.js INSTALLATION] ===
<pre>
<pre>
// ==UserScript==
// ==UserScript==

Aktuelle Version vom 19. November 2017, 14:09 Uhr

OS2.spielbericht
Dateiname os2.spielbericht.user.js
Version 1.0 (WebExtensions)
Autor Andreas Eckes, Strindheim BK
Beschreibung Ergänzt Summen- und Durchschnittswerte (nur Zweikampf) bei den Spielerstatistiken
Webseiten /rep/saison/*
Spielberichte
Funktionalität Zeigt die Summen- und Durchschnittswerte der Spielerstatistiken in den Spielberichten an
Letzte Änderung 19.11.2017

Quellcode INSTALLATION[Bearbeiten]

Version 1.0[Bearbeiten]

Hinweise[Bearbeiten]

Da der Praxistest gezeigt hat, dass die Durchschnittswerte zu den Spielerstatistiken von eher untergeordnetem Interesse sind, wurden diese entfernt. Es wird nur mehr der durchschnittliche Zweikampferfolg berechnet.

Quellcode INSTALLATION[Bearbeiten]

// ==UserScript==
// @name         OS2.spielbericht
// @namespace    http://os.ongapo.com/
// @version      1.0-SLC-WE
// @copyright    2013+
// @author       Andreas Eckes (Strindheim BK)
// @description  OS 2.0 - Ergänzt Summen- und Durchschnittswerte bei den Spielerstatistiken im Spielbericht
// @include      /^https?://(www\.)?(os\.ongapo\.com|online-soccer\.eu|os-zeitungen\.com)/rep/saison/\d+/\d+/\d+-\d+.html$/
// @grant        none
// ==/UserScript==

var borderString = "solid white 1px";
var playerStatistics = document.getElementsByTagName("table")[4];
var offsetsHorizontal = new Array(0, 0); // Linien in gesamter Breite zeichnen
var offsetsVertical = new Array(1, 2); // 1 Titel-Zeile und die 2 neuen Zeilen auslassen
// Die einfach zu berechnenden Spalten als Array
// ZK-% werden mit Summenprodukt-Funktion berechnet (3 = Index ZK% Heim, 14 = Index ZK% Auswaerts)
var simpleCols = new Array(2, 4, 5, 6, 7, 9, 10, 11, 12, 13);
var colsZkH = new Array(2, 3); // ZK und ZK-% Heim-Mannschaft
var colsZkA = new Array(13, 14); // ZK und ZK-% Auswaerts-Mannschaft
// Neue Zeilen
var sumRow = playerStatistics.insertRow(-1); // Summenzeile
var avgRow = playerStatistics.insertRow(-1); // Durchschnittszeile

// Zellen in den neuen Zeilen erzeugen
inflateRow(sumRow, playerStatistics.rows[0].cells.length);
inflateRow(avgRow, playerStatistics.rows[0].cells.length);
// Zeilenbeschriftung einfuegen
sumRow.cells[0].textContent = "Summe";
sumRow.cells[sumRow.cells.length - 1].textContent = "Summe";
avgRow.cells[0].textContent = "Durchschnitt";
avgRow.cells[avgRow.cells.length - 1].textContent = "Durchschnitt";
// Summe und Durchschnitt der "einfachen" Spalten berechnen und eintragen
var colIdx = 0;
var nonEmptyCellCount = 0;
var sumValue = 0;
var avgValue = 0.00;
for (var i = 0; i < simpleCols.length; i++) {
	colIdx = simpleCols[i];
	nonEmptyCellCount = getNonEmptyCellCount(playerStatistics, colIdx, offsetsVertical);
	// Summe
	sumValue = getColSum(playerStatistics, colIdx, offsetsVertical);
	sumRow.cells[colIdx].textContent = sumValue;
	// Durchschnitt
	avgValue = getColAvg(playerStatistics, colIdx, offsetsVertical);
	//avgRow.cells[colIdx].textContent = avgValue.toFixed(2);
}

// Durchschnitt der ZK-%-Spalten berechnen und eintragen
// Dazu die Zahl der gewonnenen Zweikaempfe berechnen und summieren und das Verhaeltnis zur Zahl der Zweikaempfe insgesamt bilden
var numberOfDuels = 0;
var numberOfDuelsWon = 0;
// Heim
numberOfDuels = getColSum(playerStatistics, colsZkH[0], offsetsVertical);
numberOfDuelsWon = Math.round(getColSumProduct(playerStatistics, colsZkH, offsetsVertical, true) / 100);
avgRow.cells[colsZkH[1]].textContent = (numberOfDuelsWon / numberOfDuels * 100).toFixed(2);
// Auswaerts
numberOfDuels = getColSum(playerStatistics, colsZkA[0], offsetsVertical);
numberOfDuelsWon = Math.round(getColSumProduct(playerStatistics, colsZkA, offsetsVertical, true) / 100);
avgRow.cells[colsZkA[1]].textContent = (numberOfDuelsWon / numberOfDuels * 100).toFixed(2);;

// Linien zeichnen
drawHorizontalLine(playerStatistics, 0, offsetsHorizontal);
drawHorizontalLine(playerStatistics, playerStatistics.rows.length - 1 - offsetsVertical[1], offsetsHorizontal);


// **************************************************************************************
// Hilfsfunktionen
// **************************************************************************************

// Erzeugt die uebergebene Anzahl von Zellen in der uebergebenen Zeile.
// row: Zeile, die aufgepumpt werden soll
// length: Anzahl der zu erzeugenden Zellen
function inflateRow(row, length) {
	for (var i = 0; i < length; i++) {
		row.insertCell(-1);
	}
}

// Liefert die Anzahl nichtleerer Zellen einer Spalte.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, die inspiziert werden soll
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getNonEmptyCellCount(table, col, offsets) {
	var returnValue = 0;
	for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
		if (table.rows[i].cells[col].textContent != "") { returnValue += 1; }
	}
	return returnValue;
}

// Liefert das Summenprodukt (wie in der Excel-Formel) von Spalten einer Tabelle.
// table: Tabelle, in der die fraglichen Spalten sind
// cols: Feld mit den Indizes der Spalten, deren Werte zeilenweise multipliziert werden sollen
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
// round: Ob jeder Summand kaufmaennisch auf Ganzzahl gerundet werden soll
function getColSumProduct(table, cols, offsets, round) {
	var returnValue = 0;
	var product = 1;
	for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
		product = 1;
		for (var j = 0; j < cols.length; j++) {
			product *= stringToNumber(table.rows[i].cells[cols[j]].textContent);
		}
		if (round) { returnValue += Math.round(product); }
		else { returnValue += product; }
	}
	return returnValue;
}

// Liefert die Summe der Werte einer Spalte.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, deren Werte summiert werden sollen
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getColSum(table, col, offsets) {
	var returnValue = 0;
	for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
		returnValue += stringToNumber(table.rows[i].cells[col].textContent);
	}
	return returnValue;
}

// Liefert den Mittelwert der Werte einer Spalte. Leere Zellen werden ignoriert.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, deren Mittelwert berechnet werden soll
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getColAvg(table, col, offsets) {
	var returnValue = 0.0;
	var countValues = 0;
	var cellContent = "";
	for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
		cellContent = table.rows[i].cells[col].textContent;
		if (cellContent != "") {
			returnValue += stringToNumber(cellContent);
			countValues += 1;
		}
	}
	if (countValues != 0) { return returnValue / countValues; }
	else { return ""; }
}

// Zeichnet eine horizontale Linie in eine Tabelle.
// table: Tabelle, in der die Linie gezeichnet werden soll
// row: Index der Zeile, unterhalb derer die Linie gezeichnet werden soll
// offsets[0]/[1]: Anzahl Spalten links/rechts, in denen keine Linie gezeichnet werden soll
function drawHorizontalLine(table, rowIdx, offsets) {
	var row = table.rows[rowIdx];
	for (var i = offsets[0]; i < row.cells.length - offsets[1]; i++) {
		row.cells[i].style.borderBottom = borderString;
	}
}

// Wandelt einen String in eine Zahl um.
// Prozentzahlen-Strings werden als Zahl interpretiert (d.h. "100%" -> 1).
// Ganze Zahlen mit Tausenderpunkten werden erkannt, wenn sie mit "." gefolgt von 3 Ziffern enden.
// Dezimalzahlen werden erkannt, wenn sie mit "." gefolgt von beliebig vielen Ziffern enden.
// Da zuerst auf ganze Zahlen geprueft wird, koennen Dezimalzahlen nicht 3 Nachkommaziffern haben.
function stringToNumber(string) {
	// parseXXX interpretiert einen Punkt immer als Dezimaltrennzeichen
	var returnValue = "";
	var percent = false;
	// Buchstaben und Whitespaces entfernen
	string = string.replace(/[\sa-zA-Z]/g, "");
	// Auf % pruefen und % entfernen
	if (string.lastIndexOf("%") != -1) {
		percent = true;
		string = string.replace(/%/g, "");
	}
	var regexpWholeSimple = /^\d+$/;
	var regexpWholeWithDots = /^\d+(\.\d{3}){1,}$/;
	var regexpDecimal = /^\d*\.\d{1,}$/;
	if (regexpWholeSimple.test(string)) {
		// Einfache ganze Zahl
		returnValue = parseInt(string);
	} else if (regexpWholeWithDots.test(string)) {
		// Ganze Zahl mit Tausenderpunkten
		returnValue = parseInt(string.replace(/\./g, ""));
	} else if (regexpDecimal.test(string)) {
		// Dezimalzahl mit Punkt als Trennzeichen
		returnValue = parseFloat(string);
	} else {
		// Kein gueltiger String
		percent = false;
		returnValue = "";
	}
	if (percent) { returnValue /= 100; }
	return returnValue;
}

Version 0.1[Bearbeiten]

Quellcode INSTALLATION[Bearbeiten]

// ==UserScript==
// @name OS2.spielbericht
// @version 0.1
// @description OS 2.0 - Ergänzt Summen- und Durchschnittswerte bei den Spielerstatistiken im Spielbericht
// @include http://os.ongapo.com/rep/saison/*
// @include http://online-soccer.eu/rep/saison/*
// @include http://www.online-soccer.eu/rep/saison/*
// @grant none
// ==/UserScript==

var borderString = "solid white 1px";
var playerStatistics = document.getElementsByTagName("table")[4];
var offsetsHorizontal = new Array(0, 0); // Linien in gesamter Breite zeichnen
var offsetsVertical = new Array(1, 2); // 1 Titel-Zeile und die 2 neuen Zeilen auslassen
// Die einfach zu berechnenden Spalten als Array
// ZK-% werden mit Summenprodukt-Funktion berechnet (3 = Index ZK% Heim, 14 = Index ZK% Auswaerts)
var simpleCols = new Array(2, 4, 5, 6, 7, 9, 10, 11, 12, 13);
var colsZkH = new Array(2, 3); // ZK und ZK-% Heim-Mannschaft
var colsZkA = new Array(13, 14); // ZK und ZK-% Auswaerts-Mannschaft
// Neue Zeilen
var sumRow = playerStatistics.insertRow(-1); // Summenzeile
var avgRow = playerStatistics.insertRow(-1); // Durchschnittszeile

// Zellen in den neuen Zeilen erzeugen
inflateRow(sumRow, playerStatistics.rows[0].cells.length);
inflateRow(avgRow, playerStatistics.rows[0].cells.length);
// Zeilenbeschriftung einfuegen
sumRow.cells[0].textContent = "Summe";
sumRow.cells[sumRow.cells.length - 1].textContent = "Summe";
avgRow.cells[0].textContent = "Durchschnitt";
avgRow.cells[avgRow.cells.length - 1].textContent = "Durchschnitt";
// Summe und Durchschnitt der "einfachen" Spalten berechnen und eintragen
var colIdx = 0;
var nonEmptyCellCount = 0;
var sumValue = 0;
var avgValue = 0.00;
for (var i = 0; i < simpleCols.length; i++) {
	colIdx = simpleCols[i];
	nonEmptyCellCount = getNonEmptyCellCount(playerStatistics, colIdx, offsetsVertical);
	// Summe
	sumValue = getColSum(playerStatistics, colIdx, offsetsVertical);
	sumRow.cells[colIdx].textContent = sumValue;
	// Durchschnitt
	avgValue = getColAvg(playerStatistics, colIdx, offsetsVertical);
	avgRow.cells[colIdx].textContent = avgValue.toFixed(2);
}

// Durchschnitt der ZK-%-Spalten berechnen und eintragen
// Dazu die Zahl der gewonnenen Zweikaempfe berechnen und summieren und das Verhaeltnis zur Zahl der Zweikaempfe insgesamt bilden
var numberOfDuels = 0;
var numberOfDuelsWon = 0;
// Heim
numberOfDuels = getColSum(playerStatistics, colsZkH[0], offsetsVertical);
numberOfDuelsWon = Math.round(getColSumProduct(playerStatistics, colsZkH, offsetsVertical, true) / 100);
avgRow.cells[colsZkH[1]].textContent = (numberOfDuelsWon / numberOfDuels * 100).toFixed(2);
// Auswaerts
numberOfDuels = getColSum(playerStatistics, colsZkA[0], offsetsVertical);
numberOfDuelsWon = Math.round(getColSumProduct(playerStatistics, colsZkA, offsetsVertical, true) / 100);
avgRow.cells[colsZkA[1]].textContent = (numberOfDuelsWon / numberOfDuels * 100).toFixed(2);;

// Linien zeichnen
drawHorizontalLine(playerStatistics, 0, offsetsHorizontal);
drawHorizontalLine(playerStatistics, playerStatistics.rows.length - 1 - offsetsVertical[1], offsetsHorizontal);


// **************************************************************************************
// Hilfsfunktionen
// **************************************************************************************

// Erzeugt die uebergebene Anzahl von Zellen in der uebergebenen Zeile.
// row: Zeile, die aufgepumpt werden soll
// length: Anzahl der zu erzeugenden Zellen
function inflateRow(row, length) {
	for (var i = 0; i < length; i++) {
		row.insertCell(-1);
	}
}

// Liefert die Anzahl nichtleerer Zellen einer Spalte.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, die inspiziert werden soll
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getNonEmptyCellCount(table, col, offsets) {
	var returnValue = 0;
	for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
		if (table.rows[i].cells[col].textContent != "") { returnValue += 1; }
	}
	return returnValue;
}

// Liefert das Summenprodukt (wie in der Excel-Formel) von Spalten einer Tabelle.
// table: Tabelle, in der die fraglichen Spalten sind
// cols: Feld mit den Indizes der Spalten, deren Werte zeilenweise multipliziert werden sollen
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
// round: Ob jeder Summand kaufmaennisch auf Ganzzahl gerundet werden soll
function getColSumProduct(table, cols, offsets, round) {
	var returnValue = 0;
	var product = 1;
	for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
		product = 1;
		for (var j = 0; j < cols.length; j++) {
			product *= stringToNumber(table.rows[i].cells[cols[j]].textContent);
		}
		if (round) { returnValue += Math.round(product); }
		else { returnValue += product; }
	}
	return returnValue;
}

// Liefert die Summe der Werte einer Spalte.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, deren Werte summiert werden sollen
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getColSum(table, col, offsets) {
	var returnValue = 0;
	for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
		returnValue += stringToNumber(table.rows[i].cells[col].textContent);
	}
	return returnValue;
}

// Liefert den Mittelwert der Werte einer Spalte. Leere Zellen werden ignoriert.
// table: Tabelle, in der die fragliche Spalte ist
// col: Index der Spalte, deren Mittelwert berechnet werden soll
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden
function getColAvg(table, col, offsets) {
	var returnValue = 0.0;
	var countValues = 0;
	var cellContent = "";
	for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
		cellContent = table.rows[i].cells[col].textContent;
		if (cellContent != "") {
			returnValue += stringToNumber(cellContent);
			countValues += 1;
		}
	}
	if (countValues != 0) { return returnValue / countValues; }
	else { return ""; }
}

// Zeichnet eine horizontale Linie in eine Tabelle.
// table: Tabelle, in der die Linie gezeichnet werden soll
// row: Index der Zeile, unterhalb derer die Linie gezeichnet werden soll
// offsets[0]/[1]: Anzahl Spalten links/rechts, in denen keine Linie gezeichnet werden soll
function drawHorizontalLine(table, rowIdx, offsets) {
	var row = table.rows[rowIdx];
	for (var i = offsets[0]; i < row.cells.length - offsets[1]; i++) {
		row.cells[i].style.borderBottom = borderString;
	}
}

// Wandelt einen String in eine Zahl um.
// Prozentzahlen-Strings werden als Zahl interpretiert (d.h. "100%" -> 1).
// Ganze Zahlen mit Tausenderpunkten werden erkannt, wenn sie mit "." gefolgt von 3 Ziffern enden.
// Dezimalzahlen werden erkannt, wenn sie mit "." gefolgt von beliebig vielen Ziffern enden.
// Da zuerst auf ganze Zahlen geprueft wird, koennen Dezimalzahlen nicht 3 Nachkommaziffern haben.
function stringToNumber(string) {
	// parseXXX interpretiert einen Punkt immer als Dezimaltrennzeichen
	var returnValue = "";
	var percent = false;
	// Buchstaben und Whitespaces entfernen
	string = string.replace(/[\sa-zA-Z]/g, "");
	// Auf % pruefen und % entfernen
	if (string.lastIndexOf("%") != -1) {
		percent = true;
		string = string.replace(/%/g, "");
	}
	var regexpWholeSimple = /^\d+$/;
	var regexpWholeWithDots = /^\d+(\.\d{3}){1,}$/;
	var regexpDecimal = /^\d*\.\d{1,}$/;
	if (regexpWholeSimple.test(string)) {
		// Einfache ganze Zahl
		returnValue = parseInt(string);
	} else if (regexpWholeWithDots.test(string)) {
		// Ganze Zahl mit Tausenderpunkten
		returnValue = parseInt(string.replace(/\./g, ""));
	} else if (regexpDecimal.test(string)) {
		// Dezimalzahl mit Punkt als Trennzeichen
		returnValue = parseFloat(string);
	} else {
		// Kein gueltiger String
		percent = false;
		returnValue = "";
	}
	if (percent) { returnValue /= 100; }
	return returnValue;
}