限制 Google 工作表中的下拉结果
Limiting the results of drop-down in Google Sheets
我在一家小型企业担任运营经理,我正在尝试设置一个便于销售员使用的订单 sheet。在订单 sheet 中,我使用了 OFFSET 函数来引用包含客户和价格的主列表。在 Customer 下,我键入客户,它会通过自动完成下拉列表从主列表中提取。产品也是如此。
顺序如下sheet:
Order Sheet Example
我的问题是我将开始输入产品,例如'prawn'。我们有十几条虾线,但某个客户只会拿走一条。所有其他大虾结果都没有针对该客户的价格。但是,自动完成功能将提供所有 'prawn' 个结果。
在主列表中,我只输入了特定客户使用的产品的价格。看看Master List是什么样子的:
Master List look
如果不能很好地记住客户想要什么,这就是反复试验。在上面的示例中,我可以输入 'topside',如果我输入 select 错误,则不会显示价格。
这令人沮丧。
我希望有一种方法来限制自动完成,这样当我为该客户键入 'prawn' 或 'topside' 时,它只会出现具有价格的自动完成字段在里面。谁能帮忙?或者有人知道任何解决方法吗?真是谢天谢地,现在的订单系统挺难的。
我相信这会如你所愿。从您的示例数据中很难分辨出来。它使用 google 应用程序脚本和 sheet 名称 and/or 可能需要在脚本中为您的数据更改列。我附上了一个样本 spreadsheet 你可以复制然后试试。您必须批准您制作的副本中的脚本。
function onEdit(e) {
var cust=e.value //The value of the edited cell
var sh=e.source.getActiveSheet().getSheetName()//Name of the active sheet.
var col=e.range.getColumn()//The edited column
var r=e.range.getRow()//The edited row
var row=e.range.offset(0,1).getA1Notation()//Cell A1 notation of cell in same row one column to the right.
var ss=SpreadsheetApp.getActiveSpreadsheet()
var s=ss.getActiveSheet().getSheetName()//Name of active sheet
var s1=ss.getSheetByName("Sheet1")//Variables for sheets
var s2=ss.getSheetByName("Sheet2")
var s3=ss.getSheetByName("TEMP")
var rng=s2.getDataRange().getValues()//Customer/Products
if(sh=="Sheet1" && col==1){//If sheet1 is active sheet and Customer (column A) is edited.
var array=[]//Array to hold customers products
for (var i=0;i<rng.length;i++){
if(rng[i][0]==cust ){
for(var j=1;j<rng[0].length-1;j++){
if(rng[i][j]!="" ){//If customers product has $ entry add to Array.
array.push([rng[0][j]])
}}}}
s3.clearContents()//Clear old product list from TEMP.
s1.getRange(row).clearContent()//Clear product dropdown
s3.getRange(1,1,array.length,1).setValues(array)//Set new customer product list in TEMP.
drop(row,cust)// Call drop function to build new dropdown.
}
if(sh=="Sheet1" && col==2){//If sheet1 is active sheet and Product (column B) is edited.
var cust1=e.range.offset(0,-1).getValue()//Get customer in A
var prod=e.range.getValue()//Get selected product
for (var i=0;i<rng.length;i++){//Get the customer/product price
if(rng[i][0]==cust1 ){
for(var j=1;j<rng[0].length-1;j++){
if(rng[0][j]==prod){
price=rng[i][j]
s1.getRange(r,5).setValue(price)//Set the price in column E
s1.getRange(r,2).clearDataValidations() //Remove the data validation dropdown in column B
}
}}
}}}
function drop(row,cust){
var ss=SpreadsheetApp.getActiveSpreadsheet()
var s3=ss.getSheetByName("TEMP")
var s1=ss.getSheetByName("Sheet1")
var cell = s1.getRange(row);//set validation in B
var ocell=s1.getRange(row).offset(0, -1).getValue()//evaluate value in A
var cellVal=cell.getValue()
if(ocell==cust){
var lr= ss.getSheetByName("TEMP").getLastRow()
var range = ss.getSheetByName("TEMP").getRange(1, 1, lr, 1)
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(range).build();//Build the dropdown
cell.setDataValidation(rule)}//Set the validation rules (Customers
products)
}
测试价差sheet:
https://docs.google.com/spreadsheets/d/1u86sdf1_mO-Mv7hQM_hRZl3Gma-Y2lsu9ZvxSW4jA1U/edit?usp=sharing
我在一家小型企业担任运营经理,我正在尝试设置一个便于销售员使用的订单 sheet。在订单 sheet 中,我使用了 OFFSET 函数来引用包含客户和价格的主列表。在 Customer 下,我键入客户,它会通过自动完成下拉列表从主列表中提取。产品也是如此。
顺序如下sheet:
Order Sheet Example
我的问题是我将开始输入产品,例如'prawn'。我们有十几条虾线,但某个客户只会拿走一条。所有其他大虾结果都没有针对该客户的价格。但是,自动完成功能将提供所有 'prawn' 个结果。
在主列表中,我只输入了特定客户使用的产品的价格。看看Master List是什么样子的:
Master List look
如果不能很好地记住客户想要什么,这就是反复试验。在上面的示例中,我可以输入 'topside',如果我输入 select 错误,则不会显示价格。
这令人沮丧。
我希望有一种方法来限制自动完成,这样当我为该客户键入 'prawn' 或 'topside' 时,它只会出现具有价格的自动完成字段在里面。谁能帮忙?或者有人知道任何解决方法吗?真是谢天谢地,现在的订单系统挺难的。
我相信这会如你所愿。从您的示例数据中很难分辨出来。它使用 google 应用程序脚本和 sheet 名称 and/or 可能需要在脚本中为您的数据更改列。我附上了一个样本 spreadsheet 你可以复制然后试试。您必须批准您制作的副本中的脚本。
function onEdit(e) {
var cust=e.value //The value of the edited cell
var sh=e.source.getActiveSheet().getSheetName()//Name of the active sheet.
var col=e.range.getColumn()//The edited column
var r=e.range.getRow()//The edited row
var row=e.range.offset(0,1).getA1Notation()//Cell A1 notation of cell in same row one column to the right.
var ss=SpreadsheetApp.getActiveSpreadsheet()
var s=ss.getActiveSheet().getSheetName()//Name of active sheet
var s1=ss.getSheetByName("Sheet1")//Variables for sheets
var s2=ss.getSheetByName("Sheet2")
var s3=ss.getSheetByName("TEMP")
var rng=s2.getDataRange().getValues()//Customer/Products
if(sh=="Sheet1" && col==1){//If sheet1 is active sheet and Customer (column A) is edited.
var array=[]//Array to hold customers products
for (var i=0;i<rng.length;i++){
if(rng[i][0]==cust ){
for(var j=1;j<rng[0].length-1;j++){
if(rng[i][j]!="" ){//If customers product has $ entry add to Array.
array.push([rng[0][j]])
}}}}
s3.clearContents()//Clear old product list from TEMP.
s1.getRange(row).clearContent()//Clear product dropdown
s3.getRange(1,1,array.length,1).setValues(array)//Set new customer product list in TEMP.
drop(row,cust)// Call drop function to build new dropdown.
}
if(sh=="Sheet1" && col==2){//If sheet1 is active sheet and Product (column B) is edited.
var cust1=e.range.offset(0,-1).getValue()//Get customer in A
var prod=e.range.getValue()//Get selected product
for (var i=0;i<rng.length;i++){//Get the customer/product price
if(rng[i][0]==cust1 ){
for(var j=1;j<rng[0].length-1;j++){
if(rng[0][j]==prod){
price=rng[i][j]
s1.getRange(r,5).setValue(price)//Set the price in column E
s1.getRange(r,2).clearDataValidations() //Remove the data validation dropdown in column B
}
}}
}}}
function drop(row,cust){
var ss=SpreadsheetApp.getActiveSpreadsheet()
var s3=ss.getSheetByName("TEMP")
var s1=ss.getSheetByName("Sheet1")
var cell = s1.getRange(row);//set validation in B
var ocell=s1.getRange(row).offset(0, -1).getValue()//evaluate value in A
var cellVal=cell.getValue()
if(ocell==cust){
var lr= ss.getSheetByName("TEMP").getLastRow()
var range = ss.getSheetByName("TEMP").getRange(1, 1, lr, 1)
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(range).build();//Build the dropdown
cell.setDataValidation(rule)}//Set the validation rules (Customers
products)
}
测试价差sheet: https://docs.google.com/spreadsheets/d/1u86sdf1_mO-Mv7hQM_hRZl3Gma-Y2lsu9ZvxSW4jA1U/edit?usp=sharing