【问题标题】:Set value based on drop down selection using script使用脚本根据下拉选择设置值
【发布时间】:2019-05-28 15:53:33
【问题描述】:

因为价格会随着时间而变化,所以我不想将价格永久地绑定到另一个单元格。所以我希望脚本根据下拉选择设置价格。

我有 Services 表和 Cost 列:

我希望脚本根据这样的选择应用成本(在Selection 表中):

这是示例电子表格: https://docs.google.com/spreadsheets/d/1O1rZUstDNSXPdUVXvaDfPO4rAQs2cJWHimfGxbddtNU/edit#gid=232108540

如何使用脚本将Services 表中的值Cost 设置为Selection 表?

【问题讨论】:

  • 为什么不直接使用 VLOOKUP,将选择表中的选定服务查找到成本表,就像这样 - =IFERROR(VLOOKUP(A2,Services!A:B,2,FALSE),0)
  • 我不想将成本值永久绑定到单元格,因为成本会随时间而变化,我想保留历史定价

标签: google-apps-script google-sheets


【解决方案1】:

试试这个:

function cost() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Services');
  var rg=sh.getRange(2,1,sh.getLastRow()-1,2);
  var vA=rg.getValues();
  var costObj={}
  for(var i=0;i<vA.length;i++) {
    costObj[vA[i][0]]=vA[i][1];
  }
  var selsh=ss.getSheetByName('Selection');
  var selrg=selsh.getRange(2,1,selsh.getLastRow()-1,2);
  var vB=selrg.getValues();
  for(var j=0;j<vB.length;j++) {
    vB[j][1]=costObj[vB[j][0]];
  }
  selrg.setValues(vB);
  //if you only want to set columnB you can do this instead of the above line
  //var vC=vB.map(function(r){return [r[1]]});
  //selsh.getRange(2,2,vC.length,1).setValues(vC);
}

作为 onEdit():

function cost(e) {//Installable onEdit()
  var sh=e.range.getSheet();
  var name=sh.getName();
  if(name!='Selection')return;
  if(e.value && e.range.columnStart==1) {
    e.range.offset(0,1).setValue(getCostObj()[e.value]);
  }
}  
function getCostObj() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Services');
  var rg=sh.getRange(2,1,sh.getLastRow()-1,2);
  var vA=rg.getValues();
  var costObj={}
  for(var i=0;i<vA.length;i++) {
    costObj[vA[i][0]]=vA[i][1];
  }
  return costObj;
}

【讨论】:

  • 这只会在我们执行脚本后增加成本值,我们可以简单地将其更改为onEdit?
  • 按照@Joshua T 的建议,将其作为单元格函数可能会更好。我认为我们倾向于过多地使用 onEdit。
  • 但是如果价格发生变化,这不会保留历史定价,我想保留历史定价吗?我们可以制作脚本以使其对onEdit 有效吗?看起来这个脚本扫描整个列并添加脚本,这对于onEdit 的需求可能效率低下
  • 好的。什么用户操作启动 onEdit() 事件?什么细胞?什么专栏? ...
  • 我的这行不正确e.range.offset(0,1).setValue(getCostObj[e.value]);,我更正了这个e.range.offset(0,1).setValue(getCostObj()[e.value]);
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 2016-04-17
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多