如何创建加减按钮来跟踪库存
How to create add and subtract buttons to track inventory
我一直在寻找类似的解决方案,但到目前为止还没有找到。这是我想要完成的:
我需要想出一个基本的解决方案来在每天结束时同步库存数量。我们对全天销售的库存进行实物盘点,但需要一些东西来记录这些变化并在用户之间共享。我想使用两个按钮(单击一个按钮减去一天结束时售出的商品数量,然后单击一个按钮添加新收到的库存)。
我的 sheet 是这样设置的:
A 列:产品标签
Col B:产品 sku
C 列:今天售出的数量
Col D:总库存数量
E 栏:添加新库存
D 列将预先填充初始库存盘点。每天结束时,我想查看我的产品列表,并在 C 列中填写当天售出的每件商品的数量。C 列填满后,我想单击 "subtract" 按钮并从 D 列中减去 C 列。
另一方面,一旦我们收到新的商品库存,我想将这些计数输入到 E 列中。一旦此列填满,我想单击 "Add" 按钮并E 列添加到 D 列。理想情况下,一旦完成加法或减法函数,C 列或 E 列将被清除并为下一天的输入做好准备。
我已经设计了我的按钮,我只需要帮助想出脚本来完成这个。
您可以为此使用 Google Apps 脚本。
如果您不熟悉,在您的特定传播sheet 中,转到工具 → 脚本编辑器,然后select 空白项目选项。
然后你可以这样写函数来实现你想要的!
function subtractSold() {
var sheet = SpreadsheetApp.getActiveSheet();
var c1 = sheet.getRange("C2");
var c2 = sheet.getRange("D2");
while (!c1.isBlank() && !c2.isBlank()){
c2.setValue(c2.getValue() - c1.getValue());
c1.clear();
c1 = c1.offset(1, 0);
c2 = c2.offset(1, 0);
}
}
基本上函数的作用是:
- 获取活跃价差的参考sheet
- 获取对第一行数据的单元格 C2 和 D2 的引用。
- 使用 while 循环重复遍历行。当任一单元格为空时终止。
- 在循环中,我们获取适当的值,减去该值并将值设置回单元格。然后我们清除 C 列中的单元格。然后我们将两个单元格引用向下移动一行(偏移方法 returns 对原始单元格的引用,但偏移 行,列 ).
然后在按钮的 "Assign script" 选项中输入函数名称(本例中为 subtractSold),将脚本分配给按钮图像。
我在这里做了一个例子 sheet(转到文件 → 复制以尝试脚本并查看代码):https://docs.google.com/spreadsheets/d/1qIJdTvG0d7ttWAUEov23HY5aLhq5wgv9Tdzk531yhfU/edit?usp=sharing
快一点
如果您尝试上面的 sheet,您会看到它一次处理一行,当您有很多行时,这可能会变得很慢。批量处理整个列可能会更快,但理解起来可能会有点复杂:
function subtractSoldBulk() {
var sheet = SpreadsheetApp.getActiveSheet();
var maxRows = sheet.getMaxRows();
var soldRange = sheet.getRange(2, 3, maxRows); // row, column, number of rows
var totalRange = sheet.getRange(2, 4, maxRows);
var soldValues = soldRange.getValues();
var totalValues = totalRange.getValues();
for (var row in soldValues) {
var soldCellData = soldValues[row][0];
var totalCellData = totalValues[row][0];
if (soldCellData != "" && totalCellData != "") {
totalValues[row][0] = totalCellData - soldCellData;
soldValues[row][0] = "";
}
}
soldRange.setValues(soldValues);
totalRange.setValues(totalValues);
}
此处的不同之处在于,我们获取的不是一个单元格,而是一个单元格区域。然后 getValues() 方法为我们提供了该范围内数据的二维数组。我们对两个数组进行计算,更新数组中的数据,然后根据数组数据设置范围的值。
您可以从 Google 的文档中找到上述方法的文档:https://developers.google.com/apps-script/reference/spreadsheet/sheet
我一直在寻找类似的解决方案,但到目前为止还没有找到。这是我想要完成的:
我需要想出一个基本的解决方案来在每天结束时同步库存数量。我们对全天销售的库存进行实物盘点,但需要一些东西来记录这些变化并在用户之间共享。我想使用两个按钮(单击一个按钮减去一天结束时售出的商品数量,然后单击一个按钮添加新收到的库存)。
我的 sheet 是这样设置的:
A 列:产品标签
Col B:产品 sku
C 列:今天售出的数量
Col D:总库存数量
E 栏:添加新库存
D 列将预先填充初始库存盘点。每天结束时,我想查看我的产品列表,并在 C 列中填写当天售出的每件商品的数量。C 列填满后,我想单击 "subtract" 按钮并从 D 列中减去 C 列。
另一方面,一旦我们收到新的商品库存,我想将这些计数输入到 E 列中。一旦此列填满,我想单击 "Add" 按钮并E 列添加到 D 列。理想情况下,一旦完成加法或减法函数,C 列或 E 列将被清除并为下一天的输入做好准备。
我已经设计了我的按钮,我只需要帮助想出脚本来完成这个。
您可以为此使用 Google Apps 脚本。
如果您不熟悉,在您的特定传播sheet 中,转到工具 → 脚本编辑器,然后select 空白项目选项。
然后你可以这样写函数来实现你想要的!
function subtractSold() {
var sheet = SpreadsheetApp.getActiveSheet();
var c1 = sheet.getRange("C2");
var c2 = sheet.getRange("D2");
while (!c1.isBlank() && !c2.isBlank()){
c2.setValue(c2.getValue() - c1.getValue());
c1.clear();
c1 = c1.offset(1, 0);
c2 = c2.offset(1, 0);
}
}
基本上函数的作用是:
- 获取活跃价差的参考sheet
- 获取对第一行数据的单元格 C2 和 D2 的引用。
- 使用 while 循环重复遍历行。当任一单元格为空时终止。
- 在循环中,我们获取适当的值,减去该值并将值设置回单元格。然后我们清除 C 列中的单元格。然后我们将两个单元格引用向下移动一行(偏移方法 returns 对原始单元格的引用,但偏移 行,列 ).
然后在按钮的 "Assign script" 选项中输入函数名称(本例中为 subtractSold),将脚本分配给按钮图像。
我在这里做了一个例子 sheet(转到文件 → 复制以尝试脚本并查看代码):https://docs.google.com/spreadsheets/d/1qIJdTvG0d7ttWAUEov23HY5aLhq5wgv9Tdzk531yhfU/edit?usp=sharing
快一点
如果您尝试上面的 sheet,您会看到它一次处理一行,当您有很多行时,这可能会变得很慢。批量处理整个列可能会更快,但理解起来可能会有点复杂:
function subtractSoldBulk() {
var sheet = SpreadsheetApp.getActiveSheet();
var maxRows = sheet.getMaxRows();
var soldRange = sheet.getRange(2, 3, maxRows); // row, column, number of rows
var totalRange = sheet.getRange(2, 4, maxRows);
var soldValues = soldRange.getValues();
var totalValues = totalRange.getValues();
for (var row in soldValues) {
var soldCellData = soldValues[row][0];
var totalCellData = totalValues[row][0];
if (soldCellData != "" && totalCellData != "") {
totalValues[row][0] = totalCellData - soldCellData;
soldValues[row][0] = "";
}
}
soldRange.setValues(soldValues);
totalRange.setValues(totalValues);
}
此处的不同之处在于,我们获取的不是一个单元格,而是一个单元格区域。然后 getValues() 方法为我们提供了该范围内数据的二维数组。我们对两个数组进行计算,更新数组中的数据,然后根据数组数据设置范围的值。
您可以从 Google 的文档中找到上述方法的文档:https://developers.google.com/apps-script/reference/spreadsheet/sheet