如何检测特定列中的最新行?

时间:2019-07-04 00:28:43

标签: google-apps-script

我的Google App脚本当前存在一些问题。

我们现在所拥有的是:当用户在该列中输入两个值(时间)时,该列之间的持续时间将自动在另一列中计算出来,这是我们通过电子表格本身中的函数完成的。

当我们传递输入值时,我们使用的是函数appendRow,由于事情会在该列中弄乱,我们将应该在duration列中输入的值设置为null,以便将其填充为空白并且电子表格本身中的函数将对其进行计算。但是,我们遇到的问题是,通过在电子表格中使用此函数,我们在没有时间输入的每一行中获得默认值00:00,这意味着appendRow函数会将这些行检测为已填充,并将这些值附加到电子表格的最底部,从而在有值和无值的行之间造成很大的差距。

我们需要一个解决方案来解决此问题,我们正在发布以获取有关此问题的所有可能解决方案。

因此,我们想到的用于解决此问题的方法是使用getRange(),然后使用setValue。通过使用getRange,我们考虑使用类似于制作1x1网格的方法,该网格的行索引与要导入值的特定列中的新单元格的行索引相同。对于列,我们可以选择列索引。但是我们很快意识到这仍然会失败,因为行索引中的appendRow仍将返回电子表格中最后一行的行索引。

我们尝试的下一个方法是在duration列中检测到任何“ 0:00:00”,然后获取相应的行Index,然后使用该行Index通过getRange()在该特定行上对setValue进行设置,失败。

for (var i = 0; i < sheet.getMaxRows()+1; i++ ){
    if (sheet.getRange(i,4).getValue() === "0:00:00") {
        sheet.getRange(i,1).setValue(datas.enterDate);
        sheet.getRange(i,2).setValue(datas.enterStartTime);
        sheet.getRange(i,3).setValue(datas.enterEndTime);
        sheet.getRange(i,6).setValue(datas.enterFullName);
        sheet.getRange(i,7).setValue(datas.enterCategory);
        sheet.getRange(i,8).setValue(datas.enterActivity);
        sheet.getRange(i,9).setValue(datas.enterLink);
        break;
     }
} 

预期结果:当函数在该列中向下移动时,它将搜索包含“ 0:00:00”的所有单元格,并且在执行该操作时,它将使用用户数据设置值。

输出:未显示任何内容。

1 个答案:

答案 0 :(得分:0)

尝试一下:

col是列号。默认值为活动单元格的列 sh是一个工作表对象,默认是当前活动工作表 ss是电子表格对象,默认值为当前活动的电子表格。

function newestRow(col,sh,ss){
  var ss=ss || SpreadsheetApp.getActive();
  var sh=sh || ss.getActiveSheet();
  var col=col || sh.getActiveCell().getColumn();
  var rg=sh.getRange(1,col,sh.getLastRow(),1);
  var vA=rg.getValues();
  while(vA[vA.length-1][0].length==0){
    vA.splice(vA.length-1,1);
  }
  return vA.length+1;
}