根据值将一行移到另一行

时间:2019-10-20 09:07:55

标签: google-apps-script google-sheets google-sheets-macros

我正在尝试根据一个单元格(触发单元格)的值将数据从一个Google表格标签移动到另一个标签。 “触发”单元格是直到特定任务的截止日期为止的天数。使用简单的代码即可计算出该天数的差值。

我在运行代码时遇到一些问题。我还有另一张纸做的类似的事情,并使用相同的代码,它似乎工作正常。谁能给我新鲜的眼神,看看我现在做了什么愚蠢的事情?我试图重写它,仍然有同样的问题。

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

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是触发值所在的列。

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

2 个答案:

答案 0 :(得分:1)

答案:

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

代码修复:

您的代码中还有一些可以清除的内容-您无需进行检查if (sheet.getName() == UpToDate),因为您可以在var sheet = ss.getSheetByName(UpToDate);上设置这两行而无需进行任何更改。< / p>

我重新编写了许多功能,以使其更有效地运行。另外,.deleteRow()如果在循环中与moveTo()一起运行似乎并不总是有效,因此我添加了一个函数来清理行。

代码:

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);
    }
  }
}

参考文献:

答案 1 :(得分:0)

更改这些:

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

至: var ss=SpreadsheetApp.getActive();

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