[英]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 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
也沒有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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.