Πρόσθεση / Αφαίρεση Απογραφή δεδομένων σε πολλαπλές στήλες, όχι μόνο μία στήλη

ψήφοι
0

Τι πρέπει να κάνω για να αλλάξετε τον κωδικό παρακάτω (στο κάτω μέρος), έτσι ώστε να λειτουργεί για πολλά ζευγάρια στήλη, όχι μόνο ένα ζευγάρι στήλη;

Είμαι παρακολούθηση των αποθεμάτων σε ένα φύλλο, κάτι σαν αυτό:

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

Θέλω να είναι σε θέση να πληκτρολογήσετε αριθμούς σε ColC, το κρύο και Cole και, στη συνέχεια, κάντε κλικ σε ένα κουμπί για να αφαιρέσετε αυτούς τους αριθμούς από τα σύνολα στα Colf, Ζ και Η, αντίστοιχα.

Βρήκα μια παρόμοια ερώτηση με μια μεγάλη απάντηση εδώ, για ένα ζεύγος στήλη: Φύλλα Google - Πώς να δημιουργήσετε προσθέσετε και να αφαιρέσετε κουμπιά για την παρακολούθηση των αποθεμάτων . Ο κωδικός πήρε μου ξεκίνησε. Είμαι αρκετά σίγουρος ότι χρειάζεται να ενημερώσετε το getRange πράγματα από ό, τι ήταν (όπως φαίνεται αμέσως παρακάτω) σε ό, τι είναι τώρα που αναφέρονται σε ολόκληρο το κωδικό λειτουργίας πιο κάτω. (Έχω αλλάξει και κάποια ονόματα / μεταβλητές που να ταιριάζει καλύτερα στις ανάγκες απογραφή μου.)

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

Αλλά τι να κάνω με το για ενότητα , έτσι ώστε να λειτουργεί και για τα τρία ζεύγη στήλη, όχι μόνο για ColC & Colf; Προσπάθησα προσθέτοντας ένα «col var σε updateValues», αλλά δεν του άρεσε στήλη (ή στήλη)? εκτός δεν ήμουν σίγουρος πώς να φωλιάζουν με την σειρά var που είναι ήδη εκεί. (Έκανα παρατηρήσετε ότι αν αλλάξει το 0 μετά από κάθε [γραμμή] σε 1, θα κάνουμε το 2ο στήλες. Αλλά δεν αρέσει όταν έκανα «var col σε updateValues» και στη συνέχεια «updateValue [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);
}

Αν σας προσφέρουν κωδικό μόνη της είναι μεγάλη. Ένα κομμάτι της εξήγησης για να πάει με αυτό θα ήταν ακόμα καλύτερα, έτσι καταλαβαίνω το γιατί και ελπίζω να το εφαρμόσει και αλλού.

Δημοσιεύθηκε 27/11/2018 στις 17:43
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Ο κωδικός σας ήταν πολύ κοντά.

Αυτός είναι ο κωδικός υποκατάστατο για τη διαχείριση τρεις στήλες των κινήσεων των δεδομένων και τρεις στήλες των συνόλων. Το μεγαλύτερο μέρος του κώδικα είναι αυτονόητη, αλλά εγώ θα επικεντρωθεί σε μερικά σημεία. Είναι καλό ότι σας ενδιαφέρει το γιατί, καθώς και το πώς, και έχω μείνει μερικές γραμμές DEBUG που ελπίζουμε ότι με βοηθήσει.

1) Ι εγκατάσταση το υπολογιστικό φύλλο και φύλλο χρησιμοποιώντας «πρότυπο» εντολές. Σε αυτήν την περίπτωση, θα χρησιμοποιηθεί getSheetByNameγια να εξασφαλίσει ότι ο κώδικας πάντα θα εκτελέσει την επιθυμητή φύλλο.

2) Δεν χρησιμοποίησα getMaxRowsεπειδή αυτό επιστρέφει «το σημερινό αριθμό των γραμμών στο φύλλο, ανεξαρτήτως περιεχομένου.». Έτσι, αν το υπολογιστικό φύλλο έχει 1.000 σειρές, αλλά έχετε μόνο, ας πούμε, 20 σειρές των δεδομένων, getmaxRowsθα επιστρέψει μια τιμή των 1.000 και σας αναγκάζουν να αξιολογήσει περισσότερες σειρές από ό, τι έχουν συμπληρωθεί με δεδομένα. Αντ 'αυτού χρησιμοποιείται ο κώδικας στις γραμμές 30 και 30 var Avalsκαι var Alastτα οποία χρησιμοποιούν μια εντολή javascript για να επιστρέψει γρήγορα τον αριθμό των γραμμών που έχουν τα δεδομένα. Επέλεξα Στήλη Α που θα χρησιμοποιηθεί για αυτό, αλλά θα μπορούσε να αλλάξει αυτό σε κάποια άλλη στήλη.

3) Αντί να δηλώνουν και να πάρει τιμές για τις δύο σειρές ( updateRangeκαι totalRange), θα δηλώσει μόνο μία σειρά δεδομένων totalRangeκαι πήρε τις τιμές για όλες τις 6 στήλες. getValuesείναι μια αρκετά δαπανηρή διαδικασία στιγμή? με να πάρει τιμές για όλες τις σειρές και όλες οι στήλες, τότε μπορείτε να επιλέξετε και να επιλέξετε ποιες στήλες θέλετε να προσθέσετε μαζί.
Η εντολή είναι:
var totalRange = sheet.getRange(NumHeaderRows + 1, 3, Alast - NumHeaderRows, 6);
Η σύνταξη (όπως σημειώσατε) είναι σειρά, στήλη, # σειρές, # από στήλες.
Η σειρά εκκίνησης είναι η σειρά ακολουθώντας τις κεφαλίδας => (NumHeaderRows + 1).
Η στήλη εκκίνησης είναι Στήλη C => 3.
Ο αριθμός των σειρών είναι οι σειρές δεδομένων μείον το σειρών κεφαλίδας => (Alast - NumHeaderRows)
Ο αριθμός των στηλών είναι ColC, κρύο, Cole, Colf, colg => 6

4) for (var row in totalValues) {
Αυτό ήταν ένα νέο για μένα, και τόσο απλό του, γι 'αυτό κρατήστε.

5) Θα χρησιμοποιηθεί για δύο συστοιχίες, όπως ακριβώς κάνατε. Θα χρησιμοποιηθεί μια συστοιχία ( RowArray) για την κατασκευή των τιμών για κάθε σειρά, και η δεύτερη συστοιχία ( MasterArray) είναι αθροιστική.
BTW, στον κώδικά σας soldValuesδεν έχει δηλωθεί ποτέ και δεν τιμές που θα αποδοθούν ποτέ σε αυτό.

6) Το πιο σημαντικό πράγμα είναι ο υπολογισμός των προσαρμογών σε κάθε γραμμή:
Για λόγους σαφήνειας, θα δηλώσει τρεις μεταβλητές totalRed, totalGreenκαι totalBlue, και έδειξε πώς τα σύνολα υπολογίστηκαν για κάθε τιμή. Αυτό δεν ήταν απολύτως απαραίτητο (θα μπορούσα να έχω μόνο ώθησε τους τύπους για κάθε νέα σύνολα), αλλά σας δίνουν τη δυνατότητα να πώς υπολογίζεται κάθε κίνηση, και οι αριθμοί της στήλης που χρησιμοποιείται σε κάθε περίπτωση.

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);
}
Απαντήθηκε 10/12/2018 στις 23:44
πηγή χρήστη

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