脚本无法将行移动到新工作表中

时间:2020-06-15 15:47:46

标签: google-apps-script google-sheets

我希望脚本根据时间触发而不是onEdit将行从一张纸移动到另一张纸(在同一车间内)(因为onEdit不适用于IMPORTRANGE)。

我发现一个脚本在编辑方面表现出色:

function onEdit(event) {
  // assumes source data in sheet named Active
  // target sheet of move to named Completed
  // getColumn with condition is currently set to column 12 or L
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Active" && r.getColumn() == 12 && r.getValue() == "8") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Completed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);

  }
}

和一些可以在时间触发器上使用的触发器,然后将它们组合/操纵以得到此触发器:

function PushToCompleted() {
  // assumes source data in sheet named TEST
  // target sheet of move to named Test2
  // getColumn with condition is currently set to column 12 or L
  var sss = SpreadsheetApp.openById('19WFdvLlWE-oI0OT8c6uBmgu2jSvdX0upM9nobscn5G4');
  var ss = sss.getSheetByName("TEST");
  var r = ss.getDataRange();;

  if(ss.getName() == "TEST" && r.getColumn() == 12 && r.getValue() == "8") {
    var row = r.getRow();
    var numColumns = ss.getLastColumn();
    var targetSheet = sss.getSheetByName("Test2");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);

  }
}

然后我进入将时间触发器设置为每分钟的时间。但这是行不通的-不能手动运行,也不能每分钟触发一次。我对脚本非常陌生,因此可以想象脚本中有什么问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

尝试一下:

function onEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()=="Active" && e.range.columnStart==12 && e.value=="8") {
    var targetSheet= e.source.getSheetByName("Completed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).moveTo(target);
    sh.deleteRow(e.range.rowStart);
  }
}

除非提供事件对象,否则无法从脚本编辑器运行此脚本。

onedit event obj

onEdit(e)在用户更改电子表格中的值时运行。

答案 1 :(得分:0)

答案:

您的条件语句总是评估为false,因此if块中的代码永远不会执行。

更多信息:

根据Apps脚本documentation on the Sheet.getDataRange() method

返回一个Range,对应于其中存在数据的维度。

从功能上讲,这等效于创建由A1和(Range.getLastColumn(),Range.getLastRow())界定的Range

这意味着当您调用ss.getDataRange()时,您将获得从A1开始的整个范围内的数据。如果我们再走一步,然后查看documentation for Range.getColumn()

返回此范围的起始列位置。

这意味着对于使用Range方法获得的Sheet.getDataRange()对象,getColumn() 始终 返回1。

此外,由于您需要对每一行执行此操作并检查每列L的值,因此需要将检查放入循环中。

修复:

根据您的评论

如果列#12(L)中的数字为8,那么我希望将整行都移到工作表Test2。

您不仅要获取数据范围并直接比较条件中的列值,还需要检查整个L列中包含值8的单元格并复制这些行:

function pushToCompleted() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var originSheet = ss.getSheetByName("TEST");
  var targetSheet = ss.getSheetByName("Test2");
  var range = originSheet.getDataRange()
  var values = range.getValues();
  
  var count = 1;
  values.forEach(function(row) {
    if (row[11] == "8") {
      targetSheet.appendRow(originSheet.getRange("A" + count + ":" + count).getValues()[0])
      originSheet.deleteRow(count);
      count--;
    }
    count++;    
  });
}

运行以下代码:

  • 将原始表和目标表设置为变量
  • 获取原始表的整个数据范围
  • 为要查看的当前行设置一个计数器
  • 遍历数据范围的每一行,并检查L列的值8:
    • 如果L列中单元格的值为8,则将整行附加到工作表Test2
    • 从原始表中删除该行
    • 也请重新调整计数器,因为您的原始单现在少了一行

我希望这对您有帮助!

参考文献:

相关问题