2016-07-13 7 views
0

Ich versuche, eine Funktion in Google Tabellen mithilfe von Google Apps Script zu erstellen.Sortieren von Werten in Google Sheet mithilfe von Schleifen in Google Apps Script

Ich habe eine Liste der 300 Werte in Blatt 1, Spalte A.

I haben eine Formel, die auf jeden Wert (in Spalte A) angelegt werden muss, eine nach der anderen.

Die Ausgabe der Formel sollte "Select" oder "Reject" lauten.

Ich kann es manuell tun, aber ich brauche es mit Google Apps Script automatisiert werden.

Ich habe Zahlen in Spalte A und ich möchte ihre Quadratwurzel in Zelle B2, Zeile für Zeile finden. Wenn die Quadratwurzel größer als ein definierter Wert ist, sollte die ursprüngliche Zahl in Spalte C aufgelistet werden, während Zahlen ohne eine Quadratwurzel größer als der definierte Wert in Spalte D aufgelistet werden sollen (siehe Beispiel unten).

enter image description here

Antwort

0

berechnen Dieser Prozess dauert 5 Schritte; eine Schleife, if/else-Anweisungen, JavaScript-Arithmetik, Vergleichsoperatoren und schließlich das Zurückschreiben von Daten in das Blatt. Für Ihre Zeilenwerte wird angenommen, dass Sie eine Kopfzeile (eingefroren oder nicht) haben, die nicht in Berechnungen verwendet werden sollte.

Sie können einen großen Führer auf JavaScript Operatoren, Arithmetik und allgemeine Sprache finden Sie hier:

http://www.w3schools.com/js/default.asp

Schritt 1: Looping & Allgemeine Variable Definition

function myFunction() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var range = sheet.getActiveRange(); 
    var lastRow = sheet.getLastRow(); 
    var checkColumn = sheet.getMaxColumns(); 
    var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1); 
    var check = checkRange.getValues(); 
    var red = "#ff0404"; 
    var green = "#3bec3b"; 

Sie werden bemerken, dass die .getRange Methode verwendet nummerierte Zeilen und Spalten, um einen Startplatz zu definieren und dann einen Index, um zu definieren, wie viele Zeilen/Spalten s einzuschließen. .lastRow gibt einen numerischen Wert an, für den wir 1 für den Indexwert subtrahieren müssen.

Ich verwende auch eine Technik für das Schleifen, die zeigt, welche Zellen bereits verarbeitet wurden. Dies ermöglicht die gewünschte zeilenweise Struktur und zeigt auch an, wo ein Fehler aufgetreten sein könnte.

for (var i = 0; i < check.length; i++) { 

Dies ist die Grundstruktur für eine Schleife. Wir haben einen Index, den wir nach jedem Durchlauf der Schleife inkrementieren. Der gebräuchlichste Index ist 'i', aber andere Variablen können verwendet werden. Es empfiehlt sich auch, den Namen Ihrer Indizes zu ändern, wenn Sie innerhalb einer Schleife eine Schleife bilden.

Schritt 2: If/Else-Anweisungen

if (check[i] == "✓") { 
      continue; 
     } else { 
     var checkCell = sheet.getRange((i+2), checkColumn, 1, 1); 
     function sorter() { 
      var number = sheet.getRange((i+2), 1, 1, 1).getValue(); 
      var sqrtCell = sheet.getRange((i+2), 2, 1, 1); 
      var moreCell = sheet.getRange((i+2), 3, 1, 1); 
      var lessCell = sheet.getRange((i+2), 4, 1, 1); 
      var outputCell = sheet.getRange((i+2), 5, 1, 1); 

Wir setzen einen Zustand zu überprüfen, if (check[i] == "✓") { und ein Maßnahmen zu ergreifen, continue,. Dies bedeutet im Grunde, dass, wenn wir bereits einen Marker gesetzt haben, dass die Zeile verarbeitet wurde, überspringen Sie es und überprüfen Sie den nächsten. check[i] verwendet unseren Index, den wir einstellen, um alle Werte zu durchlaufen, um nach '✓' zu suchen.

Danach setzen wir eine Alternative, wenn die Aussage falsch war. Hier kommt das Fleisch des Codes ins Spiel und verarbeitet die Zahlen und schreibt die Daten. Die .getRange Methoden sind alle genau zu definieren, wo zu suchen und wo zu schreiben.

Schritt 3: Arithmetik

  var squareRoot = Math.sqrt(number); 
      sqrtCell.setValue(squareRoot); 

Dies sind JavaScript-Methoden, die in der Gasreferenz angezeigt wird nicht, wie sie zu JavaScript selbst integriert sind. Sie können auf w3schools verweisen, um mehr zu finden. An dieser Stelle haben wir die Quadratwurzel programmatisch gefunden und den Wert zurück in die zuvor definierte Zelle geschrieben.

Schritt 4 & 5: Operatoren & Schreiben von Werten

if (squareRoot >= 10) { 
     moreCell.setValue(number); 
     outputCell.setValue("Select"); 
     outputCell.setBackground(green); 
    } else { 
     lessCell.setValue(number); 
     outputCell.setValue("Reject"); 
     outputCell.setBackground(red); 
    } 

Hier ist eine weitere if/else-Anweisung, die einen Operator für die Bedingung verwendet. Wir überprüfen diesmal unsere sqrt-Variable und verwenden den Operator >= für größer als gleich. Wenn wir feststellen, dass die Aussage wahr ist, schreiben Sie die ursprüngliche Zahl in eine Spalte, beschriften Sie eine andere Spalte mit "Auswählen" und machen Sie diese Beschriftung grün. Wenn wir feststellen, dass die Anweisung falsch ist, schreiben Sie die ursprüngliche Nummer in eine andere Spalte, beschriften Sie "Ablehnen", und machen Sie die Beschriftung rot.

Wir beenden den Code, indem wir ihm sagen, zuerst die Kontrollzelle rot zu machen, dann die Zahlen zu knacken, dann den Hintergrund neu zu setzen und unsere Denotationsmarke zu schreiben.

Sie können Ihre Marke markieren, die Sie bevorzugen, und verschiedene CSS-Farbformate verwenden, um Zellen ganz einfach nach Ihren Wünschen zu beschriften. Die Reihenfolge, in der Sie Ihren Code ausführen, ist entscheidend. Achten Sie darauf, dass Sie häufig testen und sicherstellen, dass Dinge passieren, wann und wie Sie es ihnen sagen.

Sie werden feststellen, dass wir definieren, was die -Funktion zuerst ist und dann in der Reihenfolge danach aufrufen. Dies stellt sicher, dass es tatsächlich läuft, wenn wir es brauchen.

Ich würde auch vorschlagen, in onEdit() und Zeitauslöser suchen, so dass es automatisch ausgeführt wird, wenn eine Bearbeitung vorgenommen/Wert hinzugefügt oder in festgelegten Zeitintervallen.

Die vollständigen Code- und Referenzbilder wurden unten eingefügt.

function myFunction() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var range = sheet.getActiveRange(); 
    var lastRow = sheet.getLastRow(); 
    var checkColumn = sheet.getMaxColumns(); 
    var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1); 
    var check = checkRange.getValues(); 
    var red = "#ff0404"; 
    var green = "#3bec3b"; 
    for (var i = 0; i < check.length; i++) { 
    if (check[i] == "✓") { 
     continue; 
    } else { 
     var checkCell = sheet.getRange((i+2), checkColumn, 1, 1); 
     function sorter() { 
     var number = sheet.getRange((i+2), 1, 1, 1).getValue(); 
     var sqrtCell = sheet.getRange((i+2), 2, 1, 1); 
     var moreCell = sheet.getRange((i+2), 3, 1, 1); 
     var lessCell = sheet.getRange((i+2), 4, 1, 1); 
     var outputCell = sheet.getRange((i+2), 5, 1, 1); 
     var squareRoot = Math.sqrt(number); 
     sqrtCell.setValue(squareRoot); 
     if (squareRoot >= 10) { 
      moreCell.setValue(number); 
      outputCell.setValue("Select"); 
      outputCell.setBackground(green); 
     } else { 
      lessCell.setValue(number); 
      outputCell.setValue("Reject"); 
      outputCell.setBackground(red); 
     } 
     } 
     checkCell.setBackground(red); 
     sorter(); 
     checkCell.setBackground('white'); 
     checkCell.setValue("✓"); 
    } 
    } 
} 

Blank Sheet with Values & Headers

While the code is running

After is has finished

+0

Dank Christopher ... statt sqrt Kann ich Verwenden Sie die GoogleFinance() -Methode, um Daten zu ziehen und in das Arbeitsblatt einzufügen, und wenden Sie dann eine Formel auf die Daten an, die von go0gle finance aufgefüllt werden. Dies ist meine aktuelle Anforderung hier ist der Link zu meinem Beispielblatt https://docs.google.com/Spreadsheets/d/1pCzdZjajoRa0hIZSNzz6uj87rtzOu4QGi1p7LZalS8k/edit? usp = sharing Ich wünsche, dass alle Symbole auf sheet1 nacheinander abgerufen werden und auf sheet2 ihre Daten werden gefüllt und die Formel, die ich verwendet habe, wird auf Daten angewendet – Vikrant

+0

Ich bin nicht vertraut mit 'GOOGLEFINANCE()', aber ich habe mehrere Blattfunktionen in meinen automatisierten Systemen verwendet. Meine Funktionen arbeiten manchmal unabhängig voneinander, sind aber häufiger verknüpft und haben Abhängigkeiten verkettet. Im Allgemeinen empfiehlt es sich, die Zellen, die Sie lesen, von den zu separierenden Zellen zu trennen. So können Sie alle Daten lesen, die 'GOOGLEFINANCE()' mit dem Code schreibt, aber stellen Sie sicher, dass Sie leere (funktionslose) Zellen/Spalten haben, wo Sie Daten schreiben müssen. – MasterCrander

+0

Warum brauchen Sie auch 2 Blätter? Es wäre einfacher, von einem Blatt aus zu sehen, und alle Ihre Formeln würden auf die gleiche Weise funktionieren. Achten Sie bei der Anwendung des Codes darauf, dass auch Ihre Bereiche entsprechend eingestellt sind. – MasterCrander

0

können Sie Google-Abfrage verwenden und Scripting vermeiden, wenn Sie wollen.

=QUERY(A2:A,"select A where A <=55",0)

die Werte zurückgeben sollte weniger als oder gleich 55 aus Spalte A. Sie würden dupliziert, dass in der nächsten Spalte und es> ändern. Es gibt Arbeitsbeispiel here.

Als Heads-Up, ich glaube nicht, dass Sie die Quadratwurzel in der B-Spalte basierend auf diesem Screenshot bekommen. Ich denke, die Quadratwurzel von 34 sollte ~ 5,8 sein, anstatt der 7,48, die Ihr Blatt anzeigt. Sie können das auch mit =SQRT(A2)

+0

Danke Tom für die Hilfe ...Aber das ist nicht das, was ich tun möchte, ich habe nur ein Beispiel gegeben und mehr über die Formel, die ich verwenden werde, ist komplex, die Formel wird wiederum einige Daten holen – Vikrant

Verwandte Themen