在MULTIPLE列中添加/减去库存数据,而不仅仅是一列

时间:2018-11-27 17:43:17

标签: javascript google-sheets

我该怎么做才能更改下面的代码(在最底部),以使其适用于多个列对,而不仅仅是一个列对?

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

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 Sheets - How to create add and subtract buttons to track inventory。代码使我开始。我很确定我需要将 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,并希望可以将其应用于其他地方。

1 个答案:

答案 0 :(得分:0)

您的代码非常接近。

这是用于管理三列数据移动和三列总计的替代代码。大多数代码是不言自明的,但我将重点介绍两点。很好,您对为什么以及如何感兴趣,而且我留下了一些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中从未声明过,也没有赋值。

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