猿问

获取两列的最后一行之间的差异,以便向单元格添加值,使列的长度相等

我有一个查询从主列表中收集名称并将它们放在工作表上。当它从该工作表中添加和删除名称时,我想添加和删除与名称一起使用的数据验证下拉框。


于是想到了求A列的最后一行和C列的最后一行的想法,因为C是下拉框所在的地方,A是他们的名字。并且通过获得这两列的差异,不仅可以确定位置,还可以确定需要更改多少单元格的大小。


我发现的一些事情是数据验证列表没有与第一项一起给出,这既好又坏。因此,我必须创建一个 setValue 函数,在下拉框所在的“PLACE”上设置名称,因为没有它,C 列的最后一行将被视为较少,因为数据验证下拉框计为“”。


这就是为什么我需要两列的差异,所以我可以将“PLACE”添加到验证框的单元格中,而不用“PLACE”一词替换列 C 中的每个单元格,因为每次编辑工作表时都会发生这种情况. 我找到了一些方法来找到我认为只是 columnA-ColumnC 左右的单个列的最后一行。甚至使它们成为绝对的。但是有一个数字我不允许在一个范围内使用它们,否则它会破坏整个系统。0.


function setValue(cellName, value) {

  SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).setValue(value);

}

function onChange(e){

var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  var FirstEmptyA = getFirstEmptyRow('A:A');

    Logger.log(FirstEmptyA);

  var FirstEmptyC = getFirstEmptyRow('C:C');

    Logger.log(FirstEmptyC);

  var dif = Math.abs(FirstEmptyA - FirstEmptyC);

    Logger.log(dif);

  var rangeA = ss.getRange(2,3,FirstEmptyA -1)

  var rangedif =ss.getRange(FirstEmptyA+1,3,dif-1)

  var EmptyArow =ss.getRange(FirstEmptyA,3)

  var validationList = SpreadsheetApp.newDataValidation().requireValueInList(['PLACE','MALL','BANK','SCHOOL'], true).build()

  if(FirstEmptyA - FirstEmptyC < 0){

        rangedif.clearDataValidations();

    rangedif.clearContent();

  }

 else if(FirstEmptyC - FirstEmptyA < 0) {

     rangeA.setDataValidation(validationList); 

        rangedif.setValue('PLACE');

  }

  else if (FirstEmptyC-FirstEmptyA = 0){

    EmptyArow.setDataValidation(validationList);

            setValue('C' + FirstEmptyC,'PLACE');

}

}


我一直在尝试许多不同的 if else 方法,但没有真正的帮助,因为每当我使用该函数时我都无法获得日志onChange。如果我onChange在脚本编辑器中运行一切正常,但是如果我在工作表中编辑任何内容,它会返回好的 ol'[] 事情仍然会发生,但是日志没有为我提供太多信息。我认为这与我正在编辑的单元格不在 C 列中有关。


除此之外,当我让它做事情时,“PLACE”或数据验证的位置通常有点不合时宜。因为我试图通过添加或减去数字使其不等于 0 来进行补偿。知道如何解决这个问题吗?


达令说
浏览 125回答 2
2回答

慕容708150

在上面回答了我自己的问题检查。不过还是谢谢你,Aung49。我当然仔细检查过。我想我只是需要睡一会儿。function onChange(e){var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();&nbsp; var FirstEmptyA = getFirstEmptyRow('A:A');&nbsp; &nbsp; Logger.log(FirstEmptyA);&nbsp; var FirstEmptyC = getFirstEmptyRow('C:C');&nbsp; &nbsp; Logger.log(FirstEmptyC);&nbsp; var dif = Math.abs(FirstEmptyA - FirstEmptyC);&nbsp; &nbsp; Logger.log(dif);&nbsp; var EmptyArow =ss.getRange(FirstEmptyA ,3)&nbsp; var validationList = SpreadsheetApp.newDataValidation().requireValueInList(['OASIS','LAT','CQ','MDR'], true).build()&nbsp; if(FirstEmptyA - FirstEmptyC < 0){&nbsp; &nbsp; &nbsp; var rangedif =ss.getRange(FirstEmptyA+1,3,dif)&nbsp; &nbsp; &nbsp; &nbsp; rangedif.clearDataValidations();&nbsp; &nbsp; rangedif.clearContent();&nbsp; }&nbsp;else if(FirstEmptyC - FirstEmptyA < 0) {&nbsp; &nbsp; &nbsp;var rangedif =ss.getRange(FirstEmptyC +1,3,dif)&nbsp; &nbsp; &nbsp;rangedif.setDataValidation(validationList);&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; rangedif.setValue('OASIS');&nbsp; }}function getFirstEmptyRow(range) {&nbsp; var spr = SpreadsheetApp.getActiveSpreadsheet();&nbsp; var column = spr.getRange(range);&nbsp; var values = column.getValues();&nbsp; var ct = 0;&nbsp; while ( values[ct] && values[ct][0] != "" ) {&nbsp; &nbsp; ct++;&nbsp; }&nbsp; return (ct);}

POPMUISE

我看到您getFirstEmptyRow(range)返回零索引的行。但是您可以使用它来获取空 A 行,var EmptyArow =ss.getRange(FirstEmptyA,3)其中的行将为您提供空行上方的行。尝试修复它并让我们知道它是否有效。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答