簡體   English   中英

在MULTIPLE列中添加/減去庫存數據,而不僅僅是一列

[英]Add/Subtract Inventory Data in MULTIPLE columns, not just ONE column

我應該怎么做才能更改下面的代碼(在最底部),以便它適用於多個列對,而不僅僅是一個列對?

我正在跟蹤工作表中的庫存,如下所示:

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,ColD和ColE中鍵入數字,然后單擊一個按鈕以分別從ColF,G和H的總數中減去這些數字。

對於一個列對,我在這里找到了一個很好的答案類似的問題: Google表格-如何創建添加和減少按鈕以跟蹤廣告資源 代碼使我開始。 我很確定我需要將getRange的內容從原來的狀態(如下所示)更新為現在整個功能代碼中進一步列出的內容。 (我還更改了一些名稱/變量以更好地滿足我的庫存需求。)

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

但是,我應該使用for部分做什么,以便它適用於所有三列對,而不僅適用於ColC和ColF? 我嘗試在updateValues中添加“ var col”,但它不喜歡col(或列); 此外,我不確定如何將其與已經存在的var行嵌套。 (我確實注意到,如果在每個[row]之后將0更改為1,它將處理第二列。但是當我先執行“ var col in 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);
}

如果僅提供代碼,那就太好了。 對其進行一些解釋會更好,因此我了解WHY,並希望可以將其應用於其他地方。

您的代碼非常接近。

這是管理三列數據移動和三列總計的替代代碼。 大多數代碼是不言自明的,但我將重點介紹兩點。 很好,您對為什么以及如何感興趣,並且我留下了一些DEBUG行,希望能得到幫助。

1)我使用“標准”命令設置電子表格和表格。 在這種情況下,我使用getSheetByName來確保代碼始終在所需的工作表上執行。

2)我沒有使用getMaxRows因為這將返回“工作表中的當前行數,無論內容如何”。 因此,如果您的電子表格有1,000行,但您僅得到20行數據,則getmaxRows將返回值1,000,並迫使您評估的行數要多於填充的數據。 相反,我在第30行和第30行使用了var Avalsvar Alast上的代碼,這些代碼使用javascript命令快速返回具有數據的行數。 我選擇了A列用於此目的,但是您可以將其更改為其他一些列。

3)我聲明並沒有聲明兩個范圍( updateRangetotalRange )的值,而是聲明了一個數據范圍totalRange並獲得了所有6列的值。 getValues是一個相當耗時的過程。 通過獲取所有行和所有列的值,然后可以選擇要添加到一起的列。
該命令是:
var totalRange = sheet.getRange(NumHeaderRows + 1, 3, Alast - NumHeaderRows, 6);
語法(如您所述)是行,列,行數,列數。
起始行是標題=>(NumHeaderRows +1)之后的行。
起始列是列C => 3。
行數是數據行減去標題行=>(Alast-NumHeaderRows)
列數是ColC,ColD,ColE,ColF,ColG => 6

4) for (var row in totalValues) {
對我來說,這是一個新事物,它是如此簡單,所以我保留它。

5)和您一樣,我使用了兩個數組。 我使用一個數組( RowArray )為每一行建立值,第二個數組( MasterArray )是累積的。
順便說一句,在您的代碼中,從未聲明soldValues也沒有soldValues分配任何值。

6)最重要的是計算每一行的調整量:
為了清楚起見,我聲明了三個變量totalRedtotalGreentotalBlue ,並說明了如何計算每個值的總數。 這並不是絕對必要的(我可以為每個新的總計推算公式),但是它們使您能夠計算每個運動的方式以及每種情況下使用的列號。

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM