Hinzufügen / subtrahieren Bestandsdaten in mehreren Spalten, nicht nur eine Spalte

stimmen
0

Was soll ich tun, den Code zu ändern (ganz unten), so dass es für mehrere Spaltenpaare funktioniert, nicht nur ein Spaltenpaar?

Ich Tracking-Inventar in einem Blatt, etwa wie folgt:

ColA      ColB  ColC  ColD  ColE  ColF  ColG  ColH
Category  Item  R+/-  G+/-  B+/-  Red   Green Blue
AAA        A                       1     0     0
AAA        B                       2     1     0

Ich möchte in der Lage sein, um Zahlen einzugeben in COLC, ColD und ColE und dann auf eine Schaltfläche klicken, um diese Zahlen aus den Summen in Colf, G und H, die jeweils zu subtrahieren.

Ich fand eine ähnliche Frage mit einer großen Antwort hier, für eine Spalte Paar: Google Sheets - Wie Add erstellen und Schaltflächen subtrahieren Inventar zu verfolgen . Der Code hat mich begonnen. Ich bin mir ziemlich sicher , dass ich brauchte , die zu aktualisieren getRange Sachen aus , was es (unmittelbar unten) zu dem, was jetzt in dem gesamten Funktionscode weiter unten aufgeführt ist. (Ich habe auch einige Namen / Variablen besser zu meinem Inventar Bedürfnisse anzupassen.)

  var updateRange = sheet.getRange(2, 3, maxRows); // row, column, number of rows
  var totalRange = sheet.getRange(2, 4, maxRows);

Aber was mache ich mit dem tun für Abschnitt , so dass es für alle drei Säulenpaaren arbeitet, nicht nur für COLC & Colf? Ich versuchte , einen „var col in update“ und fügte hinzu , aber es hat nicht wie col (oder Spalte); Außerdem habe ich nicht sicher war , wie es mit der var Reihe zu nisten , die bereits vorhanden ist. (Ich habe feststellen , dass , wenn ich die 0 nach jeder [Zeile] auf 1 geändert, wäre es die zweite Spalt tun. Aber es hat es nicht, wenn ich „var col in update“ tue und dann „Update [0] [col ]“.)

function subtractUpdateBulk() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var maxRows = sheet.getMaxRows();

  var updateRange = sheet.getRange(2, 3, maxRows, 3); // row, column, # of rows, # of cols
  var totalRange = sheet.getRange(2, 6, maxRows, 3);

  var updateValues = updateRange.getValues();
  var totalValues = totalRange.getValues();
  for (var row in updateValues) {
    var updateCellData = updateValues[row][0];
    var totalCellData = totalValues[row][0];

    if (updateCellData !=  && totalCellData != ) {
      totalValues[row][0] = totalCellData - updateCellData;
      updateValues[row][0] = ;
    }
  }

  updateRange.setValues(soldValues);
  totalRange.setValues(totalValues);
}

Wenn Sie Code allein anbieten, ist groß. Ein bisschen Erklärung zu gehen mit es noch besser wäre, so verstehe ich, warum und es an anderer Stelle hoffentlich anwenden kann.

Veröffentlicht am 27/11/2018 um 17:43
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Der Code war ziemlich nah dran.

Dies ist der Ersatz Code drei Spalten von Datenbewegungen und drei Spalten von Summen zu verwalten. Der meiste Code ist selbsterklärend, aber ich werde auf ein paar Punkte konzentrieren. Es ist gut, dass Sie in die interessiert sind, warum sowie die, wie, und ich habe einige DEBUG Linien links, die hoffentlich mit unterstützen.

1) I - Setup und die Tabellenkalkulationsblatt unter Verwendung von „Standard“ Befehle. In diesem Fall habe ich , getSheetByNameum sicherzustellen , dass der Code immer auf das gewünschte Blatt ausführen würde.

2) Ich habe nicht verwenden , getMaxRowsweil diese gibt „die aktuelle Anzahl der Zeilen in dem Blatt, unabhängig vom Inhalt.“. Also , wenn Sie Ihre Tabelle hat 1000 Zeilen aber Sie haben nur bekam, sagen wir, 20 Zeilen von Daten, getmaxRowseinen Wert von 1000 zurück , und Sie zwingen, mehr Zeilen auswerten als mit Daten gefüllt. Stattdessen habe ich den Code auf den Leitungen 30 und 30 var Avalsund var Alastder einen Javascript - Befehl verwenden , um schnell die Anzahl der Zeilen zurück , die Daten haben. Ich wählte Spalte A für diesen Einsatz, aber man könnte dies zu einer anderen Spalte ändern.

3) Anstatt zu erklären und erhalten Werte für zwei Bereiche ( updateRangeund totalRange), erklärte ich nur einen Datenbereich totalRangeund bekam die Werte für alle 6 Spalten. getValuesein ziemlich zeit kostspieliger Prozess ist; durch Werte für alle Zeilen immer und alle Spalten, können Sie dann auswählen , welche Spalten Sie zusammen hinzufügen möchten.
Der Befehl lautet:
var totalRange = sheet.getRange(NumHeaderRows + 1, 3, Alast - NumHeaderRows, 6);
Die Syntax (wie man festgestellt) ist Zeile, Spalte, Anzahl der Zeilen, # von cols.
Die Startzeile ist , die Zeile im Anschluss an dem Kopf => (NumHeaderRows + 1).
Die Startspalte ist Spalte C => 3.
Die Anzahl der Zeilen ist die Datenzeilen weniger die Kopfzeilen => (Alast - NumHeaderRows)
Die Anzahl der Spalten ist COLC, Kälte, ColE, Colf, ColG => 6

4) for (var row in totalValues) {
Das war ein neuer für mich, und es ist so einfach, so halte ich es.

5) Ich habe zwei Arrays, wie Sie es getan haben. I verwenden einen Array ( RowArray) , um die Werte für jede Reihe zu bauen, und das zweite Array ( MasterArray) ist kumulativ.
BTW, in Ihrem Code soldValuesnicht immer deklariert und keine Werte je zugeordnet.

6) Das Wichtigste ist die Berechnung der Anpassung auf jeder Linie:
Aus Gründen der Klarheit, erklärte ich drei Variablen totalRed, totalGreenund totalBlue, und zeigte , wie die Summen für jeden Wert berechnet wurden. Das war nicht unbedingt notwendig (ich nur die Formeln für jede neue Summe geschoben haben könnte), aber sie ermöglichen es Ihnen, wie jede Bewegung berechnet wird, und die Spaltennummern in jedem Fall verwendet.

function so_53505294() {

    // set up spreadsheet
    // include getsheetbyname to ensure calculations happen on the correct sheet
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Sheet1");

    //set some variables
    var NumHeaderRows = 1; // this is the number of header rows - user changeable
    var totalRed = 0;
    var totalGreen = 0;
    var totalBlue = 0;

    // arrays used later in loop
    var RowArray = []; // row by row values
    var MasterArray = []; // row by row, cumulative values

    // get number of rows of data
    var Avals = ss.getRange("A1:A").getValues();
    var Alast = Avals.filter(String).length;
    // Logger.log("the last row = "+Alast);// DEBUG

    // define the entire data range
    var totalRange = sheet.getRange(NumHeaderRows + 1, 3, Alast - NumHeaderRows, 6); // row, column, # of rows, # of cols
    //Logger.log("the TotalRange = "+totalRange.getA1Notation());//DEBUG

    // get the data fior the entire range
    var totalValues = totalRange.getValues();

    // loop through thr rows
    for (var row in totalValues) {

        // clear RowArray at the start of each new row
        RowArray = [];

        // calculate the new totals
        totalRed = totalValues[row][0] + totalValues[row][3];
        totalGreen = totalValues[row][1] + totalValues[row][4];
        totalBlue = totalValues[row][2] + totalValues[row][5];
        //Logger.log("row = "+row+", Movement RED  = "+totalValues[row][0]+", Old Stock RED = "+totalValues[row][3]+", New RED = "+totalRed); //DEBUG
        //Logger.log("row = "+row+", Movement GREEN  = "+totalValues[row][1]+", Old Stock GREEN = "+totalValues[row][4]+", New GREEN = "+totalGreen); //DEBUG
        //Logger.log("row = "+row+", Movement BLUE  = "+totalValues[row][2]+", Old Stock BLUE = "+totalValues[row][5]+", New BLUE = "+totalBlue); //DEBUG

        // update the RowArray for this row's values
        RowArray.push(0, 0, 0, totalRed, totalGreen, totalBlue);
        // update the MasterArray for this row's values
        MasterArray.push(RowArray);
    }

    // Update the data range with the new Master values.
    totalRange.setValues(MasterArray);
}
Beantwortet am 10/12/2018 um 23:44
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more