我的库存很小,我想制作一个结账系统。
我试图弄清楚是否可以制作两个不同的电子表格以复杂的方式相互协作。 我有一个电子表格,其中我的初始数据位于工作表“数据”中,其中有我的主要列。
A 项目代码, B 物品名称、 D 数量
在另一个电子表格中,我想设置一个非常“简单”的结账表(因为我不能在同一个电子表格中包含敏感数据(价格等)。 我想制作一个包含 20 行的下拉列表,即使输入产品代码或名称也可以显示项目: *C001 为苹果链接 在下拉列表中,如果我写 c001 或 apple,则会将 Apple 作为项目调出。 在每个项目的下一个单元格中,显示要检查的数量。
如果是两个不同的电子表格,我无法将其放在一起。如果它们是相同的,我可以管理,但在数据验证中不能将 importrange 与查询或过滤器一起使用。
如果有可能实现这样的目标,有人可以给我带来启发吗?
尝试了这段代码,但不知何故不起作用:
function checkout() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var checkoutSheet = ss.getSheetByName("Checkout");
// Get selected item and quantity from checkout sheet
var selectedItem = checkoutSheet.getRange("A2").getValue();
var quantity = checkoutSheet.getRange("B2").getValue();
// Open the Data spreadsheet
var dataSS = SpreadsheetApp.openById("googlesheetID");
var dataSheet = dataSS.getSheetByName("Data");
// Find the row corresponding to the selected item in the data sheet
var itemRow = getItemRow(selectedItem, dataSheet);
if (itemRow !== -1) {
// Update quantity in data sheet
var currentQuantity = dataSheet.getRange(itemRow, 4).getValue();
dataSheet.getRange(itemRow, 4).setValue(currentQuantity - quantity);
} else {
Browser.msgBox("Item not found in inventory.");
}
}
function getItemRow(item, sheet) {
var dataRange = sheet.getRange("B:B"); // Assuming Item Name is in column B
var values = dataRange.getValues();
for (var i = 0; i < values.length; i++) {
if (values[i][0] === item) {
return i + 1; // Return the row number (adding 1 to match sheet indexing)
}
}
return -1; // Return -1 if item not found
}
根据提供的信息,即:
我想制作一个 20 行的下拉列表,即使输入产品代码或名称也可以显示项目...
我可以建议的是使用动态代码,根据项目数据库中的信息,将提供的项目代码或项目名称(从给定的下拉列表中)更新为其相应的值,如屏幕截图所示:
为了实现这一目标,我们将首先在您的电子表格上安装
onEdit
触发器,这可以通过以下步骤实现:
在您的 Apps 脚本编辑器中,单击左侧菜单上的“触发器”选项卡(时钟/闹钟图标)
页面右下角,点击“添加触发器”
选择并配置您要创建的触发器类型,然后单击“保存”。
脚本
我没有对您提供的脚本进行重大更改,而是专门为 onEdit 触发器创建了一个新脚本
searchItem()
;请参阅下面的完整脚本:
function searchItem(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var checkoutSheet = ss.getSheetByName("SheetName");
// Open the Data spreadsheet
var dataSS = SpreadsheetApp.openById("googlesheetID").getSheetByName("Data");
var dataVals = dataSS.getRange("A2:B").getValues().filter(x => x != ""); // removes all empty cells on dataVals
var cell = ss.getActiveCell().getA1Notation(); // gets the A1 notation of the cell
var item = checkoutSheet.getRange(cell).getValue();
if (cell == "B2"){ // the value changed is on the Items dropdown list
dataVals.forEach(x => x[1] == item ? checkoutSheet.getRange("A2").setValue(x[0]) : x);
}
else if (cell == "A2"){ // the value changed is on the Item Code column
for(var i = 0; i < dataVals.length; i++){
if (dataVals[i][0] == item){
checkoutSheet.getRange("B2").setValue(dataVals[i][1]);
break;
}
else if(i == dataVals.length - 1){
// sets a blank value to denote that no item code was found in the database
checkoutSheet.getRange("B2").setValue("");
}
}
}
}
function checkout() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var checkoutSheet = ss.getSheetByName("SheetName");
// Get selected item and quantity from checkout sheet
var selectedItem = checkoutSheet.getRange("B2").getValue();
var quantity = checkoutSheet.getRange("C2").getValue();
// Open the Data spreadsheet
var dataSS = SpreadsheetApp.openById("googlesheetID");
var dataSheet = dataSS.getSheetByName("Data");
// Find the row corresponding to the selected item in the data sheet
var itemRow = getItemRow(selectedItem, dataSheet);
if (itemRow !== -1) {
// Update quantity in data sheet
var currentQuantity = dataSheet.getRange(itemRow, 4).getValue();
dataSheet.getRange(itemRow, 4).setValue(currentQuantity - quantity);
} else {
Browser.msgBox("Item not found in inventory.");
}
}
function getItemRow(item, sheet) {
var dataRange = sheet.getRange("B:B"); // Assuming Item Name is in column B
var values = dataRange.getValues().filter(x => x != ""); // removes all empty cells on dataRange
for (var i = 0; i < values.length; i++) {
if (values[i][0] === item) {
return i + 1; // Return the row number (adding 1 to match sheet indexing)
}
}
return -1; // Return -1 if item not found
}
该脚本的作用是在项目代码和项目之间进行 2 路更新功能:
它首先使用
getActiveCell()
和 getA1Notation()
函数从结账表中获取更新的数据,以确定更新的数据是商品代码还是商品名称(来自下拉列表)
然后将数据与数据库进行比较,以查看是否包含商品代码或商品名称
如果找到该商品,则会在结帐单上返回其对应的商品代码
同样,如果找到该项目代码,下拉列表将显示分配给该代码的相应项目;但是,如果在数据库中找不到提供的项目代码,则下拉项目列表将返回空白
并且由于
searchItem
脚本附加到可安装的 onEdit
触发器,这意味着只要对 A2 单元格(项目代码)或 B2 单元格(项目下拉列表)进行更改,它就会自动运行并相应地应用必要的更改。