【问题标题】:Google script to change a cell value based on another cell that contains a formula谷歌脚本根据另一个包含公式的单元格更改单元格值
【发布时间】: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


    【解决方案1】:

    我建议在你的公式中使用公式 IFS

    您可以查看这篇文章以获取有关 IFS 公式的帮助,https://support.google.com/docs/answer/7014145

    ...IF(B12="Group DSA (OR542-W2)", IFS(condition1,"$18.06",condition2,"$18.61",condition3,"$20.15")
    

    您应该创建一个表格,列出“Group DSA (OR542-W2)”服务下哪些客户属于哪些费率,然后使用 VLOOKUP 获取他们的名称,他们的费率将很容易获得。

    因此,这为您简化了工作,因为您不必使用 Apps 脚本来完成它。

    【讨论】:

    • 哦,哇,这成功了。太感谢了!我将不得不进一步阅读我可以做些什么来简化所有事情,因为现在我有 68 个客户,其计费率各不相同,所以如果我按原样使用公式,它会有点臃肿,但它会起作用!这会让我开始。我在这一切方面都是一个新手,但我正在学习。所以我毫不怀疑,既然我有了一个起点,我就可以在这里改进。我很感激你!
    • 如果您有那么多客户,我建议您改用过滤功能。您可以在support.google.com/docs/answer/3093197?hl=en 上查找。简而言之,您仍然应该创建一个不同汇率的表格,以便您将来可以访问和编辑数据。如果对您有帮助,请 Rmbr 勾选我的答案:D
    • 我点击了upvote按钮(可能不是这里所说的,但感谢reddit我知道的就这么多)但它不会让我,因为我的声誉太低了。它说“感谢您的反馈!您需要至少 15 声望才能投票,但您的反馈已被记录下来。”不过,我仍然感谢您的帮助! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多