【问题标题】:Script for Google sheet to change a cells value based on another cells value (in a column range)Google工作表的脚本以根据另一个单元格值(在列范围内)更改单元格值
【发布时间】:2017-09-20 09:16:02
【问题描述】:

这是场景: 我的 Googlesheet 中的 E 列有一个“是”和“否”的下拉列表。每次用户回答“否”时,我希望 G 列中的相应单元格包含“不适用”字样。但是如果用户回答是,我希望 G 中的那个单元格有另一个是和否的下拉列表。

我尝试在从该线程获得的脚本上进行构建: Google Sheets formula to change a cells value based on another cells value

这几乎是完美的,但我不能让它适用于一个范围(最好是一整列)。任何建议将不胜感激:)

由于我在尝试调整它以供我自己使用时没有取得任何成功,这里是来自上述线程的复制代码:

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var s=ss.getActiveSheet()
  var nota=e.range.getA1Notation()
  if(nota=="E10"){
  var val=e.range.getValue()
    if(val=="Levy"){
      s.getRange("E11").setDataValidation(null)
      s.getRange("E11").setValue("Monthly")
  }
      else{
  s.getRange('E11').clearContent()      
  var cell = s.getRange('E11');
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(['Triannual', 'Quarterly']).build();
  cell.setDataValidation(rule);
   }}}

这是我的愚蠢尝试:

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var s=ss.getActiveSheet()
  var nota=e.range.getA1Notation()
  if(nota=="E2:E500"){
  var val=e.range.getValue()
    if(val=="No"){
      s.getRange("G2:G500").setDataValidation(null)
      s.getRange("G2:G500").setValue("Not Applicable")
  }
      else{
        s.getRange('G2:G500').clearContent()      
        var cell = s.getRange('G2:G500');
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(['Yes','No']).build();
  cell.setDataValidation(rule);
   }}}

【问题讨论】:

  • 贴出你的代码,这样帮助会更容易
  • 我实际上并没有通过编辑从另一个线程获得的脚本得到任何改进,所以我只是将它按原样添加到我的原始帖子中:)
  • 发布您尝试过的代码,而不是您引用的代码。
  • 万一你还不能说,我是个菜鸟。我只是去替换我理解的那些,在这种情况下,它们只是双引号和单元格引用中的文本:|。稍后我会添加我的“调整”,供您参考

标签: google-apps-script google-sheets


【解决方案1】:

您需要循环一系列单元格,这就是原始脚本不起作用的原因。 .getValue() 返回一个单元格,你不能有一个范围(就像在你编辑的脚本中一样)。

此脚本将查看整个页面并每次循环播放。这是可取的,因为您不必保持数据井然有序。换句话说,您可以跳过 E 列,并在出现时将它们标记为“是”或“否”。空白单元格被忽略。

  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 ColE == "Yes"
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(["Yes", "No"]).build();

  // Loop the sheet
  for(var i=0; i<data.length; i++) {

    // Test ColE. 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][4] == "Yes") {

      // If it's "Yes," add the Data Validation rule to Col G 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, 7).clear().setDataValidation(rule);

      // If ColE == "No," mark ColG as "Not Applicable"
    } else if(data[i][4] == "No") {
      sheet.getRange(i+1, 7).clearDataValidations().setValue("Not Applicable");
    }
  }
}

另请注意,当您更改 Col E 时,这将更改值。因此,如果您将“是”更改为“否”,则 Col G 将更改为“不适用”。

【讨论】:

  • 谢谢你,布赖恩!我的代码有一个小问题,.. 当我在 E 中回答“是”时,下拉按钮肯定会出现,但将答案更改为“否”会混合“不适用”文本和 G 中的下拉菜单(反之亦然)...任何摆脱它的方法?我原帖中提到的代码,居然没有这个问题?
  • 现在,当我在 E 列的一个单元格中回答“否”时,我收到此错误:TypeError: Cannot find function clearDataValdation in object Range。 (第 26 行,文件“代码”):{
  • 真的吗?确保事先在那里进行验证。听起来您在运行脚本之前已经将其删除。如果你有想要分享的虚拟表格,我也可以在那里看看。我无法在我的模板上复制该错误。
  • 嗨,Brian,它在我之前制作的其中一个副本上运行良好!我相信我可以设法调整原始副本。如果我不能,我可以使用副本 :D 非常感谢!
【解决方案2】:
 for (var i = 0; i < 5000; i++) {
function checkData() {
      if(SpreadsheetApp.getActiveSheet().getRange("E" + i).getValue() == "No"){
          SpreadsheetApp.getActiveSheet().getRange("G" + i).setValue('Not Applicable');
      }
      else{
    SpreadsheetApp.getActiveSheet().getRange("G" + i).setValue('Applicable');
        }
    }
}

希望这对你有用:) 顺便说一句,获得 5000 行的范围会非常慢!这是另一种更快的方法!

var ss = SpreadsheetApp.getActiveSpreadsheet();
  var tsSheet = ss.getSheetByName("YOUR SHEET NAME AT THE BOTTOM OF THE PAGE");
  var tsRows = parseInt(tsSheet.getLastRow());

     for (var i = 0; i < tsRows; i++) {
    function checkData() {
          if(SpreadsheetApp.getActiveSheet().getRange("E" + i).getValue() == "No"){
              SpreadsheetApp.getActiveSheet().getRange("G" + i).setValue('Not Applicable');
          }
          else{
        SpreadsheetApp.getActiveSheet().getRange("G" + i).setValue('Applicable');
            }
        }
    }

编辑:

var ss = SpreadsheetApp.getActiveSpreadsheet();
  var tsSheet = ss.getSheetByName("YOUR SHEET NAME AT THE BOTTOM OF THE PAGE");
  var tsRows = parseInt(tsSheet.getLastRow());

     for (var i = 0; i < tsRows + 1; i++) {
    function checkData() {
          if(SpreadsheetApp.getActiveSheet().getRange("E" + i).getValue() == "No"){
              SpreadsheetApp.getActiveSheet().getRange("G" + i).setValue('Not Applicable');
          }
          else{
        SpreadsheetApp.getActiveSheet().getRange("G" + i).setValue('Applicable');
            }
        }
    }

【讨论】:

  • 嘿詹姆斯,感谢您的及时回答,但我尝试了这两个脚本,但它们对我来说不起作用。我什么也没得到,甚至没有错误,..
  • 实现后能看到代码吗?您可以添加 Logger.log(E[i])
  • 额外信息:是否因为我在第一行有需要对脚本进行细微调整的标题?
  • 改成这个 - for (var i = 0; i
  • 刚刚注意到您最近的回复。我在哪里添加?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 2015-10-11
  • 1970-01-01
相关资源
最近更新 更多