为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

达令说 2021-06-02 18:55:11
我有一个查询从主列表中收集名称并将它们放在工作表上。当它从该工作表中添加和删除名称时,我想添加和删除与名称一起使用的数据验证下拉框。于是想到了求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 来进行补偿。知道如何解决这个问题吗?
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

在上面回答了我自己的问题检查。不过还是谢谢你,Aung49。我当然仔细检查过。我想我只是需要睡一会儿。


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 EmptyArow =ss.getRange(FirstEmptyA ,3)

  var validationList = SpreadsheetApp.newDataValidation().requireValueInList(['OASIS','LAT','CQ','MDR'], true).build()

  if(FirstEmptyA - FirstEmptyC < 0){

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

        rangedif.clearDataValidations();

    rangedif.clearContent();

  }

 else if(FirstEmptyC - FirstEmptyA < 0) {

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

     rangedif.setDataValidation(validationList); 

        rangedif.setValue('OASIS');

  }


}

function getFirstEmptyRow(range) {

  var spr = SpreadsheetApp.getActiveSpreadsheet();

  var column = spr.getRange(range);

  var values = column.getValues();

  var ct = 0;

  while ( values[ct] && values[ct][0] != "" ) {

    ct++;

  }

  return (ct);

}


查看完整回答
反对 回复 2021-06-03
?
POPMUISE

TA贡献1765条经验 获得超5个赞

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


查看完整回答
反对 回复 2021-06-03
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信