2016-09-29 2 views
0

Ich versuche, einen bestimmten Bereich meines Blattes onEdit automatisch so zu sortieren, dass auf der Oberseite eine leere Zelle ist und nach unten die ältesten Einträge. Ich habe diesen Code aus here bekommen und versucht, es für meine Bedürfnisse zu ändern:Sortieren eines bestimmten Bereichs auf Bearbeiten()

function onEdit(e) 
{ 
    var sheet = ss.getActiveSheet(); 
    if(sheet != ss.getSheetByName('cover sheet')) 
    { 
     var editRange = { // B4:J6 
     top: 29, 
     bottom: sheet.getLastRow()+1, 
     left: 4, 
     right: 11 
     }; 
     // Exit if we're out of range 
     var thisRow = e.range.getRow(); 
     if (thisRow < editRange.top || thisRow > editRange.bottom) return; 

     var thisCol = e.range.getColumn(); 
     if (thisCol < editRange.left || thisCol > editRange.right) return; 

     // We're in range; timestamp the edit 
     var ss = e.range.getSheet(); 
     ss.getRange(editRange).sort({column: 1, ascending: true}); 
    } 
} 

Aber das funktioniert nicht. Irgendwelche Ideen? Hier ist der Link zu einem sample sheet.

Grüße

+0

Was ist damit nicht funktioniert? Können Sie ein Beispiel angeben, um zu zeigen, was es tut und was es tun soll? –

+0

Es sollte die bestimmten Zeilen in einem Blatt sortieren, wenn das Blatt nicht das Deckblatt ist. Es tut nichts. Ich werde eine Beispiel-Tabelle erstellen – Jonnyboy

+0

Versuchen Sie, die Funktion aus dem Code-Editor mit einigen 'Logger.log ('einige Text hier:' + VariablenName) 'Anweisungen, dann VIEW die Protokolle, um zu sehen, was es in den Protokollen gedruckt. Beispielsweise. Setzen Sie 'Logger.log ('it ran!')' Ganz oben in die Funktion, um festzustellen, ob die Funktion ausgeführt wird oder nicht. Ändern Sie die erste 'if' Anweisung in:' if (sheet.getName() === 'Deckblatt') ' –

Antwort

0

Nun,

, was Sie sollte wie folgt sein müssen:

function onEdit(e) { 
    var thisSS = e.source, 
     editedRow = e.range.getRow(), 
     editedCol = e.range.getColumn(); 

    if(editedCol === 4){ 
    thisSS.sort(editedCol, false); 
    } 
    thisSS.insertRowBefore(2); 
} 

dann fügen Sie sie in Skript Ihrem Blatt ist, dann gehen Sie auf „Ressourcen >> Trigger des aktuellen Projekts“ und richten Sie den Trigger ein, um die Funktion "onEdit" auszuführen, wenn das onEdit-Ereignis auftritt.

mit freundlichen Grüßen.

+0

Leider brauche ich eine andere Lösung als Zeile einfügen, da auf der linken Seite dieses Bereichs eine Region ist, die nicht geändert werden sollte. – Jonnyboy

+0

Auch die Sorte sollte nicht die Grenzen der Box verlassen, sondern innerhalb der Box sortiert werden. – Jonnyboy

0

Stellen Sie sicher, dass sich Zellen in den angegebenen Bereichen befinden. Wie von @SpiderPig in diesem SO question erwähnt, wird ein Bereich ungültig, wenn keine Zelle innerhalb des angegebenen Bereichs ist.

Dazu können Sie auch versuchen, bottom: sheet.getLastRow() -1 wie die Lösung unter Verwendung gegeben:

function AutoSortOnEdit() { 
    var sheetNames = ["testsheet456", "testsheet457", "testsheet458"]; 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    sheetNames.forEach(function(name) { 
     var sheet = ss.getSheetByName(name); 
     var range = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); 
     range.sort({column: 1, ascending: true}); 
    }); 
} 

Hoffnung, die für Sie arbeitet. Glückliche Kodierung!

+0

Ich bin ein bisschen besorgt über die Laufzeit: Wenn ich das richtig sehe, sortiert es immer alle Blätter in diesem Bereich, auch wenn die Änderung nicht in diesem Bereich vorgenommen wurde. Technisch wäre es genug, nur das Blatt zu sortieren, das bearbeitet wurde, wenn die Bearbeitung in diesem Bereich war oder liege ich falsch? – Jonnyboy

Verwandte Themen