限制Google表格中下拉列表的结果

时间:2017-10-17 12:08:14

标签: drop-down-menu google-sheets offset

我在小型企业担任运营经理,我正在尝试设置一个易于销售人员使用的订单。在订单表中,我使用OFFSET函数来引用包含客户和价格的主列表。在Customer下,我键入客户,并通过自动完成下拉列表从主列表中提取客户。产品也是如此。

以下是订单:

Order Sheet Example

我的问题是我会开始输入产品,例如'虾'。我们有十几条虾线,但特定的客户只需要一条。所有其他的虾结果都没有该客户的价格。但是,自动完成功能将提供所有'对虾'结果。

在主列表中,我仅为特定客户使用的产品输入了价格。看一下Master List的样子:

Master List look

如果没有对客户想要什么的绝佳记忆,这是一次试验和错误的练习。在上面的示例中,我可以键入“topside”,如果我选择了错误的那个,则不会出现价格。

这令人沮丧。

我希望有一种限制自动完成的方法,这样当我为该客户输入'prawn'或'topside'时,它只会出现具有价格的自动完成字段。有人可以帮忙吗?或者有人知道任何解决方法吗?我真的很感激,目前的订单系统非常困难。

1 个答案:

答案 0 :(得分:0)

我相信这会做你想要的。从您的示例数据中判断一下有点困难。它使用谷歌应用程序脚本和工作表名称和/或列可能需要在脚本中更改您的数据。我正在附上您可以复制的示例电子表格然后尝试。您必须批准所制作的副本中的脚本。

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)
 }

测试电子表格:  https://docs.google.com/spreadsheets/d/1u86sdf1_mO-Mv7hQM_hRZl3Gma-Y2lsu9ZvxSW4jA1U/edit?usp=sharing