如何将行移动到命名范围的最后一行(onEdit)

时间:2019-02-22 21:58:20

标签: google-apps-script google-sheets

我希望此脚本将row移至命名范围(“ APPROVED”)的底部

function onEdit(e) {
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var s = e.source.getActiveSheet();
   var r = e.source.getActiveRange();

   if (s.getName() == "Sheet1" && r.getColumn() == 6 && r.getValue() == "APPROVED") {

      var row = r.getRow();
      var numColumns = s.getLastColumn();
      var namedRange = ss.getRangeByName('APPROVED');
      s.getRange(row, 1, 1,numColumns).moveTo(namedRange);
      s.deleteRow(row)
   } 
}

该脚本当前覆盖指定范围内的第一行。我尝试了以下

var row = r.getRow();
var numColumns = s.getLastColumn();
var namedRange = ss.getRangeByName('APPROVED');
var target = (namedRange.getLastRow() +1, 1));
s.getRange(row, 1, 1,numColumns).moveTo(target);
s.deleteRow(row)

我当然是GAS的新手,所以对修复的任何详细说明将不胜感激。

2 个答案:

答案 0 :(得分:0)

尝试一下:

function setLastRowOfANamedRange(row,s,nr) {
  var nr=nr || SpreadsheetApp.getActive().getRangeByName('APPROVED');//debug
  var s=s || SpreadsheetApp.getActive().getActiveSheet();//debug
  var row=row || 5;//debug
  var vA=nr.getValues();
  vA[vA.length-1]=s.getRange(row,1,1,vA[0].length).getValues();
  nr.setValues(vA);
}

答案 1 :(得分:0)

  • 您想将一行移到namedRange的最后一行。

如果我的理解是正确的,作为另一种解决方案,该修改如何?我认为您的第二个脚本的方法接近目标。因此,在此答案中,我使用了moveTo()。因为我认为此方法可能对其他用户也有用,所以我发布了此信息。我认为您的情况有几个答案。因此,请仅考虑其中之一。

发件人:

s.getRange(row, 1, 1,numColumns).moveTo(namedRange);

收件人:

 s.getRange(row, 1, 1,numColumns).moveTo(namedRange.offset(namedRange.getLastRow() - namedRange.getRow(), 0));
  • 在此修改中,使用namedRangeoffset()的最后一行添加一行。
  • 如果要将行放在namedRange的最后一行的下一行,请进行以下修改。
    • s.getRange(row, 1, 1,numColumns).moveTo(namedRange.offset(namedRange.getLastRow() - namedRange.getRow() + 1, 0))

注意:

  • 在脚本中,使用moveTo()。因此,s.deleteRow(row)的这一行可能会被删除。为此,请根据您的情况进行操作。

参考文献:

如果这不是您想要的结果,我表示歉意。

编辑:

  • 您要在指定范围的最后一行放置一行。
  • 在这种情况下,最后一行是指定范围内的最后一行。
    • 例如,命名范围有40行,并且某些值放在前5行中,而您要从6行开始。

如果我的理解是正确的,那么该修改如何?

发件人:

s.getRange(row, 1, 1,numColumns).moveTo(namedRange);

收件人:

var values = namedRange.getValues();
for (var i = values.length - 1; i >= 0; i--) {
  var r = values[i].some(function(e) {return e});
  if (r) {
    s.getRange(row, 1, 1,numColumns).moveTo(namedRange.offset(i + 1, 0));
    break;
  }
}
  • namedRange.getLastRow()检索指定范围的最大行号。因此,我准备了用于检索命名范围中最后一行的脚本。