如何编辑EditVal以获取Google Apps脚本中的范围而非单元格文本

时间:2017-04-27 09:20:43

标签: google-apps-script

输入数据enter image description here

预期产出:

当我在C3:C!Sheet1中输入任何名称(来自C3:C!Sheet2)时,在D3:D!Sheet1中有一个自动动态下拉列表,其中仅包含A3:A!Sheet2中的那些语言对应于C3中的输入名称:C!Sheet1。

目前,当我输入" IndividualName"在C3:C!Sheet1中,只显示预期的输出。但我不想要" IndividualName",我想要C3:C!Sheet2中的任何名字。

以下是已发布的Google电子表格的链接,以便更好地了解我正在尝试实现的目标。 (对不起,我之前不太清楚。)

  

https://docs.google.com/spreadsheets/d/1BcoB4-xIW9zRU_Vr8TciAIJFV4Fajp3vWTtitKYQXOc/edit#gid=906258441

如何编辑行号。以下是Google Apps脚本中的13,而不是引用内容==" IndividualName",它指的是电子表格中sheet2中C = C列的范围。

1   function onEdit(event){
2   var ss=SpreadsheetApp.getActiveSpreadsheet()
3    var s=ss.getSheetByName("Sheet1")
4     var sheet = event.source.getActiveSheet().getName();
5  var editedCell = event.range.getSheet().getActiveCell();
6  var editVal=event.range.getSheet().getActiveCell().getValue()
7  var editRow=event.range.getSheet().getActiveCell().getRow()
8  
9  var s1=ss.getSheetByName("Sheet2")///////get new sheet
10  var lr1=s1.getLastRow()//////get last row of new sheet
11 
12  if(sheet=="Sheet1" && editedCell.getColumn() ==3){
13    if(editVal=="IndividualName"){
14     var validation=s1.getRange(3, 1, lr1,1)//////get column A data of new sheet
15      var cell= s.getRange(editRow,4,1,1)
16      var rule = SpreadsheetApp.newDataValidation().requireValueInRange(validation,false)
17      .setAllowInvalid(false)
18      .build();
19      cell.setDataValidation(rule);
20    }}}

感谢名单!

1 个答案:

答案 0 :(得分:2)

如果我正确读取此内容,您需要在表单2中构建的任何输入名称旁边添加“验证”下拉列表。

为此,您需要遍历列表并返回一个可用于创建验证菜单的对象。我会做以下事情:

function newValidation() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName('Sheet1');
  var sheet2 = ss.getSheetByName('Sheet2');

  // Get the data from the database and the list to check against.
  var sheet1Data = sheet1.getDataRange().getValues();
  var sheet2Data = sheet2.getDataRange().getValues();

  // Loop through any names in sheet 2
  for(var i=2; i<sheet2Data.length; i++) {
    var langs = [];

    // loop through the database for each name
    for(var j=2;j<sheet1Data.length;j++) {

      // if the names match, push the corresponding value into the array
      if(sheet2Data[i][2] == sheet1Data[j][2]) {
        langs.push(sheet1Data[j][0]);
      }
    }

    // Include an error if the array is empty
    if(langs.length === 0) {
      langs.push("No languages matched");
    }

    // Build the validation rule and append it to the matching row
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(langs).build();
    sheet2.getRange(i+1, 4,1,1).setDataValidation(rule);
  }
}

我在代码中将您的模板表重命名为更加友好。从脚本编辑器运行时,此脚本将检查整个工作表。你可以附加一个触发器来检查编辑的任何时间。它也可以减少到仅匹配C列上没有验证的行更快一点,但我会留给你。

您可以看到一个有效的例子in this Google Sheet