【发布时间】:2021-10-02 00:25:05
【问题描述】:
I made this sheet 为我们所做的工作创建发票。
主选项卡(发票)是我们实际打印和发送的内容。 基本上,发票选项卡上的每个单元格中都有一个公式,用于从其他 2 个选项卡(无纸化和客户端)中提取信息以实际填充发票。 您从下拉菜单中选择一个客户,然后使用客户选项卡中的信息填充账单信息,然后使用无纸选项卡中的信息填充发票的其余部分。
无纸标签中的所有信息(服务日期、工作时间、行驶里程、服务代码等)均来自外部来源,即我们的时钟。
发票选项卡中已经有公式可以为我完成 90% 的工作,它们可能不是最优雅的公式,但它们可以完成工作。 直到最近,他们完成了 100% 的工作,但是某个服务代码的计费费率发生了变化,这就是我遇到的问题。
您可以在 ColI 的计费率下看到我有以下公式
=IF(B12="1:1 ADL (OR526)", "$32.23", IF(B12="2:1 ADL (OR526-ZE)","$64.46", IF(B12="1:1 at DSA Event (OR542-R1)", "$32.23", IF(B12="Group DSA (OR542-W2)", "$18.61","")))
不漂亮,但它很简单,而且以前可以正常工作。现在我遇到的问题是服务代码“Group DSA (OR542-W2)”有多种费率,具体取决于客户。费率如下:18.06 美元、18.61 美元、20.15 美元、22.03 美元、24.29 美元和 27.11 美元。
所以我的问题是,我可以解决这个问题的最佳方法是什么?我在脚本方面很糟糕,但是我在一个较旧的线程中找到了以下脚本并尝试使用它,但我不知道如何向其中添加其他服务代码,而且它的行为非常不稳定。客户端切换时不清除空白条目的验证,有时输入不正确。
function addValidation() {
// Get the spreadsheet and active sheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
// Get the data as an Array you can iterate and manipulate
var data = sheet.getDataRange().getValues();
// Store a rule to use for the Data Validation to be added if ColB == "Group DSA (OR542-W2)"
var rule = SpreadsheetApp.newDataValidation().requireValueInList(['$18.06', '$18.61', '$20.15', '$22.03', '$24.29', '$27.11']).build();
// Loop the sheet
for(var i=0; i<data.length; i++) {
// Test ColB. Note that the array is 0-indexed, so A=0, B=2, etc...
// To change which columns you're testing, change the second value.
if(data[i][1] == "Group DSA (OR542-W2)") {
// If it's "Group DSA (OR542-W2)," add the Data Validation rule to Col I for that row.
// Note that .getRange() is _not_ 0 indexed, which is why you need `i+1` to get the correct row
sheet.getRange(i+1, 9).clear().setDataValidation(rule);
// If ColB == "1:1 ADL (OR526)," mark ColI as "32.23"
} else if(data[i][1] == "1:1 ADL (OR526)") {
sheet.getRange(i+1, 9).clearDataValidations().setValue("32.23");
}
}
}
我也尝试使用此代码,但它根本不起作用,我假设这是因为我在 B2 中有一个公式,因为当我删除公式并手动输入服务代码时它确实起作用了。
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var s=ss.getActiveSheet()
var nota=e.range.getA1Notation()
if(nota=="B12"){
var val=e.range.getValue()
if(val=="1:1 ADL (OR526)"){
s.getRange("I12").setDataValidation(null)
s.getRange("I12").setValue("$32.23")
}
else{
s.getRange('I12').clearContent()
var cell = s.getRange('I12');
var rule = SpreadsheetApp.newDataValidation().requireValueInList(['$18.06', '$18.61', '$20.15', '$22.03', '$24.29', '$27.11']).build();
cell.setDataValidation(rule);
}}}
我不是编码员,我知道非常基本的 python 和 Java,但在这里没有任何帮助。我通常可以将一堆公式混合在一起以使某些东西起作用,但在这种情况下,我只是不知所措。这几天我一直在用头撞墙。如果有任何人愿意帮助我,或者甚至指出一些可以帮助我的材料的正确方向,我将不胜感激。
提前谢谢你。
【问题讨论】:
标签: google-apps-script google-sheets