【问题标题】:Google Sheets - Script to change cell value based on several cells values谷歌表格 - 根据多个单元格值更改单元格值的脚本
【发布时间】:2018-02-06 19:29:05
【问题描述】:

我已经搜索了一段时间,并尝试将来自各种已回答主题的脚本一起工作,这将允许我根据输入的数据调整相邻单元格的内容。我似乎无法让它正常工作,需要一些帮助才能将船引导到正确的方向。这是我想要完成的任务:

--如果单元格 A2:A 的值为六位数字且单元格 D2:D(同一行)的值为“MATCH”,则单元格 B2:B 的值应设置为“ANN” -- 如果单元格 A2:A 的值是一个六位数字并且单元格 D2:D(同一行)的值是“NO MATCH”,那么单元格 B2:B 的值应该设置为“ANN”并且一个 drop ['ANN','RNW'] 的向下数据验证列表填充列表的默认值设置为“ANN” --如果单元格 A2:A 的值的长度为 7 个或更大的字符,则 ['1DY','RNW','NEW'] 的下拉数据验证列表填充列表的默认值设置为“一岁”

是否可以将数据验证单元格的值设置为特定的默认值?这很重要,因为当用户输入数据时,他们很可能会接受默认值。如果他们不想要默认值,那么他们可以从下拉列表中选择一个值。

我构建了一个测试表,它显示了当在 A 列中填写数据以及在 B 列中填写相关值时表的外观。

我的测试在这里:https://docs.google.com/spreadsheets/d/1p8sq63S-vSU1FKFLjtr2ZypItN5viXotoZL0Ki2PoQM/edit?usp=sharing

这是我尝试构建的拼凑而成的脚本(我也觉得这很有趣)。这是我第一次尝试让 Google 脚本在电子表格上运行。

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var aSheet = ss.getActiveSheet();
  var aCell = aSheet.getActiveCell();
  var aColumn = aCell.getColumn();
  var aRow = aCell.getRow();
  //var licenseStatus = aSheet.getRange(aRow, aColumn+9).getValue();

 // The row and column here are relative to the range
 // getCell(1,1) in this code returns the cell at B2, B2
  var licenseTypeCell = aSheet.getRange(aRow, aColumn+1);

  if (aColumn == 1 && aSheet.getName() == 'Onsite') {
    if (isnumber(aCell) && (len(aCell) <= 6)) {
      var rule = SpreadsheetApp.newDataValidation().requireValueInList(['ANN','RNW']).build();
      licenseTypeCell.setValue("ANN");
      licenseTypeCell.setDataValidation(rule);
    } else {
      var rule = SpreadsheetApp.newDataValidation().requireValueInList(['1DY','RNW','NEW']).build();
      licenseTypeCell.setValue("1DY");
      licenseTypeCell.setDataValidation(rule);
    }
  }
}

任何帮助/指导将不胜感激。

【问题讨论】:

    标签: google-sheets spreadsheet google-spreadsheet-api google-sheets-api


    【解决方案1】:

    您在正确的轨道上,很少有细微的变化。您将在下面找到一些要在您的代码中使用的新功能。

    1) getValue() 您使用var aCell = aSheet.getActiveCell() 获取您的单元格,即已编辑的单元格。但是要获取单元格的值,您需要执行以下操作 aValue = aCell.getValue()

    2) isNaN() 检查aValue(如上所述)是否为数字。您将使用一个名为isNaN(aValue) 的函数。 Google 脚本使用 javascript 平台,因此我们需要使用来自javascript 的函数。这与您在 google 电子表格中使用的内置函数不同。如果值为 Not A Number(NAN),则返回 True。因此,我们使用非运算符(!)来翻转返回值,就像这样

    if(!isNaN(aValue))
    

    3) 位数 google 脚本中没有 len 函数,因此要确定数字是否为 6 位长,您可以执行以下操作

     if(aValue < 1000000) 
    

    您的最终代码将如下所示:

    function onEdit() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var aSheet = ss.getActiveSheet();
      var aCell = aSheet.getActiveCell();
      var aColumn = aCell.getColumn();
      var aRow = aCell.getRow();
      //var licenseStatus = aSheet.getRange(aRow, aColumn+9).getValue();
    
     // The row and column here are relative to the range
     // getCell(1,1) in this code returns the cell at B2, B2
      var licenseTypeCell = aSheet.getRange(aRow, aColumn+1);
      var aValue = aCell.getValue()
      if (aColumn == 1 && aSheet.getName() == 'Main') {
        if (!isNaN(aValue) && aValue < 1000000) {
          var matchCell = aSheet.getRange(aRow, aColumn+3).getValue()
          //The above gets value of column D (MATCH or NO MATCH)
          if(matchCell == "MATCH"){ //Check if Col D is MATCH
            licenseTypeCell.setValue("ANN");
          }
          else{
          var rule = SpreadsheetApp.newDataValidation().requireValueInList(['ANN','RNW']).build();
          licenseTypeCell.setValue("ANN");
          licenseTypeCell.setDataValidation(rule);
          }
        } else {
          var rule = SpreadsheetApp.newDataValidation().requireValueInList(['1DY','RNW','NEW']).build();
          licenseTypeCell.setValue("1DY");
          licenseTypeCell.setDataValidation(rule);
        }
      }
    }
    

    另外,请注意添加以下行以检查 col D 值

    var matchCell = aSheet.getRange(aRow, aColumn+3).getValue()
    //The above gets value of column D (MATCH or NO MATCH)
    if(matchCell == "MATCH"){ //Check if Col D is MATCH
     licenseTypeCell.setValue("ANN");
    }
    

    【讨论】:

    • 这太棒了!感谢 Jack 的快速回复以及功能的详细说明。自从我使用 Javascript 以来已经有一段时间了,所以我很惊讶我比我想象的更接近。我做了更多的工作来添加一些自上次发布以来我想到的附加条件。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多