根据值将一行移动到另一行

Moving one row to another based on value

我正在尝试根据一个单元格(触发单元格)的值将数据从一个 Google Sheet 选项卡移动到另一个选项卡。 "trigger" 单元格是距特定任务截止日期的天数。该值是使用一个简单的代码来计算天数差异的。

我在获取代码到 运行 时遇到了一些问题。我有另一个 sheet 做 similiar-ish 事情并使用相同的代码,它似乎工作正常。任何人都可以给我一双新的眼睛看看我现在做了什么愚蠢的事情吗?我试图重写它,但仍然有同样的问题。

我重写了代码,从网上复制粘贴,逐行阅读,我似乎找不到问题所在。

function moveToDue() {

  var UpToDate = "Up To Date";
  var Due = "Due";
  var triggerDue = "21";
  var triggerCol = 26;

  var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
  var ss = SpreadsheetApp.openByUrl(url);
  var sheet = ss.getSheetByName(UpToDate);
  var range = sheet.getActiveCell();

//Move to Due

  if (sheet.getName() == UpToDate && range.getColumn() == triggerCol && range.getValue() == triggerDue) {

    var targetSheet = ss.getSheetByName(Due);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);

    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
    sheet.deleteRow(range.getRow());
      }
}

UpToData 和 Due 是不同的标签标题。

triggerDue 是需要触发移动的到期日之前的天数(在本例中为 21)。

triggerCol 是触发器值所在的列。

sheet 的副本: https://docs.google.com/spreadsheets/d/1-shzMIIlj247YFWY4Cc1bh6gW895lQWsjvc5gTi-fto/edit?usp=sharing

更改这些:

var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah"; var ss = SpreadsheetApp.openByUrl(url);

致: var ss=SpreadsheetApp.getActive();

这仅在用户打开电子表格时起作用,因为他们必须 select 一行。根据我的测试,当您在服务器上打开 spreadsheet/sheet 时,活动单元格始终是 "A1".

答案:

存在一些代码问题,包括 .getActiveCell() 和某些 iffor 逻辑的不正确使用。

代码修复:

你的代码中还有一些你可以清理的东西 - 你不需要检查 if (sheet.getName() == UpToDate) 因为你之前在 var sheet = ss.getSheetByName(UpToDate); 上设置了这两行而不改变任何东西.

我重写了很多函数以使其 运行 更高效。此外,如果 运行 与 moveTo() 在一个循环中,.deleteRow() 似乎并不总是有效,因此我添加了一个函数以在之后清理行。

代码:

function moveToDue() {
  var triggerDue = 21;
  var triggerCol = 26;
  var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
  var ss = SpreadsheetApp.openByUrl(url);
  var upToDate = ss.getSheetByName("Up To Date");
  var targetSheet = ss.getSheetByName("Due");
  var daysUntilEnd = upToDate.getRange(3, 26, upToDate.getLastRow() - 2).getValues();

  for (var i = 0; i < (upToDate.getLastRow() - 2); i++) {
    if (daysUntilEnd[i][0] <= triggerDue) {
      var targetLocation = targetSheet.getRange(targetSheet.getDataRange().getLastRow() + 1, 1, 1, 26);
      var uTDRange = upToDate.getRange(i + 3, 1, 1, 26);

      uTDRange.moveTo(targetLocation);
    }    
  }
  deleteEmptyRows(upToDate);
}

function deleteEmptyRows(utds) {
  for (var i = 0; i < utds.getLastRow(); i++) {
    if (utds.getRange('A' + (i + 1)).getValue() == "") {
      utds.deleteRow(i + 1);
    }
  }
}

参考文献: