Ohne Apps-Skript
Ohne Apps Script kann man keine neue Funktion erstellen. Die einzige Möglichkeit, den Prozess zu rationalisieren, besteht darin, mehr Zellen irgendwo zu platzieren und auf diese zu verweisen.
Beispiel: Geben Sie unter jeder Überschrift wie "Gewicht" den Befehl ein
=regexextract(address(1, column()), "[A-Z]+")
Dadurch werden die Spaltenbuchstaben unter die Überschriften gesetzt. Fügen Sie die Zeile mit Buchstaben in den Bereich "Überschriften" ein. Verwenden Sie in der Abfragezeichenfolge
hlookup("Weight", Headers, 2, 0)
Das ist leichter für die Augen als
SUBSTITUTE(ADDRESS(1,MATCH("Weight", Headers, 0),4), "1", "")
Mit Apps Script
Wenn Sie einen Bereich (benannt oder anderweitig) an eine benutzerdefinierte Funktion übergeben, werden die Werte übergeben , ohne dass Informationen zu ihrer Position im Blatt vorliegen. Aber ich habe eine Lösung gefunden: Leiten Sie die Position der Header aus dem ersten Argument von ab query
. Es ist nicht erforderlich, "Header" einzuschließen, was sich selbst wiederholte.
Version 1: Header im Abfragebereich enthalten
Ich bevorzuge es, die Kopfzeilen in den an die Abfrage übergebenen Bereich aufzunehmen und die Anzahl der Kopfzeilen als drittes Argument von anzugeben query
. Dies vermeidet eine Fehlinterpretation von Daten als Header oder umgekehrt. Zum Beispiel:
=QUERY(A1:F13, "select "&GetHeader("Type")&" where ("&GetHeader("Version")&" = 'Version 1') and ("&GetHeader("Type")&" <> 'Type')", 2)
Hier ist die benutzerdefinierte Funktion, die mit der obigen Abfrage verwendet werden soll:
function getHeader(name) {
var sheet = SpreadsheetApp.getActiveSheet();
var formula = SpreadsheetApp.getActiveRange().getFormula();
var args = formula.match(/\w+:\w+(?=[ ,])/);
var range = sheet.getRange(args[0]);
var firstRow = range.offset(0, 0, 1, range.getWidth());
var headers = firstRow.getValues();
for (var i = 0; i < headers[0].length; i++) {
if (headers[0][i] == name) {
var notation = range.getCell(1, i+1).getA1Notation();
var column = notation.replace(/\d/, '');
return column;
}
}
return 'Not found';
}
Die Funktion erhält die Formel aus der Zelle, aus der sie aufgerufen wurde. Es extrahiert das erste Bereichsargument der Formel mit einem regulären Ausdruck. Dann durchsucht es die erste Zeile dieses Bereichs , vorausgesetzt, es ist die Kopfzeile, auf der Suche nach der angegebenen Zeichenfolge. Es erhält die A1-Notation der Zelle mit der Zeichenfolge, entfernt den Zeilenteil davon und gibt das Ergebnis zurück.
Version 2: Header aus Zeile 1
Eine alternative Version, bei der die Überschriften unabhängig von den Zeilen im Abfrageargument aus der ersten Zeile des Blattes stammen. Einfach ersetzen
var firstRow = range.offset(0, 0, 1, range.getWidth());
mit
var firstRow = sheet.getRange(1, range.getColumn(), 1, range.getWidth());
Mit dieser Version können Sie verwenden
=QUERY(A3:F13, "select "&GetHeader("Type")&" where ("&GetHeader("Version")&" = 'Version 1') and ("&GetHeader("Type")&" <> 'Type')")