我该怎么做才能更改下面的代码(在最底部),以使其适用于多个列对,而不仅仅是一个列对?
我正在跟踪工作表中的库存,如下所示:
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,并希望可以将其应用于其他地方。
答案 0 :(得分:0)
您的代码非常接近。
这是用于管理三列数据移动和三列总计的替代代码。大多数代码是不言自明的,但我将重点介绍两点。很好,您对为什么以及如何感兴趣,而且我留下了一些DEBUG行,希望能得到帮助。
1)我使用“标准”命令设置电子表格和表格。在这种情况下,我使用getSheetByName
来确保代码始终在所需的工作表上执行。
2)我没有使用getMaxRows
,因为它返回“工作表中的当前行数,而与内容无关。”因此,如果您的电子表格有1,000行,但是您只有20行数据,那么getmaxRows
将返回值1,000,并迫使您评估的行数要多于填充的数据。取而代之的是,我在第30行和第30行的var Avals
和var Alast
中使用了代码,这些代码使用javascript命令来快速返回具有数据的行数。我选择了A列用于此目的,但是您可以将其更改为其他一些列。
3)我没有声明和获取两个范围(updateRange
和totalRange
)的值,而是仅声明了一个数据范围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)最重要的是每行调整的计算:
为了清楚起见,我声明了三个变量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);
}