与多列相关的Google表格脚本

时间:2020-01-21 15:05:59

标签: google-apps-script google-sheets

借助此处链接的指导视频,我已经能够编写以下脚本,该脚本使我可以在电子表格中操作相关的下拉列表

function onEdit(){

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Operators");

  var activeCell = ss.getActiveCell();

  if(activeCell.getColumn() == 10 && activeCell.getRow() > 8){

    activeCell.offset(0, 1).clearContent().clearDataValidations();

    var headers = datass.getRange(1, 1, 1, 2).getValues();

    var headersIndex = headers[0].indexOf(activeCell.getValue()) + 1;

    if(headersIndex != 0){

        var validationRange = datass.getRange(2, headersIndex, datass.getLastRow());
        var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
        activeCell.offset(0, 1).setDataValidation(validationRule);

    }

  }



}

它有效!!!太棒了。但是,我有一个问题与上述脚本的以下行有关

if(activeCell.getColumn() == 10 && activeCell.getRow() > 8){

我的电子表格上的第10列与J列相关,这是K列中的从属下拉列表从中提取其信息以在从属下拉列表中提供正确信息的地方,并且包含此行,我的脚本可以正常工作。但是,我在N列(第14列),R列(第18列)和V列(第22列)中也有重复的内容,它们都为下列中的从属下拉列表提供了与J列相同的信息。 / p>

所以基本上我的问题是我可以将第14、18和22列合并到此脚本中,以与第10列相同的方式工作,同时使它们彼此独立吗? -也就是说,我不想选择与J列相关的内容,并且将其复制到N列中。

我试图简单地创建以下行:

if(activeCell.getColumn() == 10, 14, 18, 22 && activeCell.getRow() > 8){

从某种意义上说,它可以让我根据需要独立地工作所有依赖的下拉菜单。但是,这对电子表格中的其他数据验证造成了严重破坏-实际上,每个依存下拉菜单之后的下两个单元格都是复选框,当使用此修改行时,我从依存下拉列表中选择的内容实际上导致了删除下一个单元格中的复选框-我显然不想发生这种情况!

现在,我已经通过在脚本顶部为以下各列创建脚本的多个功能,从而完全解决了该问题

function onEdit(){
  j();
  n();
  r();
  v();

}

,然后为每个设置单独的功能,这绝对完美。因此,我有一个解决方案,但是在这里我要寻求帮助,这仅仅是因为我希望将所有内容都包含在一个简短的脚本中,而不是每个专栏都需要使用4或5个脚本。这可能吗?或者我已经对这个特定问题有了最好的解决方案?

1 个答案:

答案 0 :(得分:1)

问题是由

的语法引起的

if(activeCell.getColumn() == 10, 14, 18, 22 && activeCell.getRow() > 8)

要将功能同时应用于多个列,您需要

使用logical OR operator ||

这意味着:修改

if(activeCell.getColumn() == 10, 14, 18, 22 && activeCell.getRow() > 8)

if((activeCell.getColumn() == 10 || activeCell.getColumn() == 14 || activeCell.getColumn() == 18 || activeCell.getColumn() == 22) && activeCell.getRow() > 8)

另外:为了使您的代码更简单,请按如下所示重写它:

  var active = activeCell.getColumn();
  if((active == 10 || active == 14 || active == 18 || active == 22) && activeCell.getRow() > 8)