Google 表格 - 根据多个单元格值更改单元格值的脚本

Google Sheets - Script to change cell value based on several cells values

我已经搜索了一段时间,并尝试从各种已回答的主题中编写一个脚本,使我能够根据输入的数据调整相邻单元格的内容。我似乎无法让它正常工作,需要一些帮助来引导船舶正确的方向。这是我想要完成的:

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

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

我构建了一个测试 sheet,它显示了在 A 列中填写数据并在 B 列中填写相关值时 sheet 应该是什么样子。

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

这是我试图构建的拼凑脚本(我也觉得很有趣)。这是我第一次尝试将 Google 脚本改成 运行 的传播 sheet。

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

任何 help/guidance 将不胜感激。

您走在正确的轨道上,稍作改动。您将在下面找到一些要在您的代码中使用的新函数。

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

2) isNaN() 检查 aValue(如上所述)是否为数字。您将使用一个名为 isNaN(aValue). Google script uses javascript platform and hence we need to use functions from javascript 的函数。这与您在 google 电子表格中使用的内置函数不同。它 returns True 如果值为 Not A Number(NAN)。因此,我们使用非运算符 (!) 来翻转 return 值,就像这样

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

另外,请注意添加以下行以检查列 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");
}