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

时间:2018-02-06 19:29:05

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

我一直在寻找一段时间并试图合作一个来自各种答案主题的脚本,这将允许我根据输入的数据调整相邻的单元格内容。我似乎无法让它正常工作,并需要一些帮助指导船舶正确的方向。以下是我要完成的任务:

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

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

我构建了一个测试表,显示了在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);
    }
  }
}

非常感谢任何帮助/指导。

1 个答案:

答案 0 :(得分:0)

你走在正确的轨道上,几乎没有什么微小变化。您将在下面找到代码中使用的一些新功能。

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

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

if(!isNaN(aValue))

3)位数谷歌脚本中没有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");
}