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



我希望脚本基于时间触发器而不是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);
}
}

然后我进去将时间触发器设置为每分钟一次。但它不起作用 - 不是手动运行,也不是每分钟时间触发器。我对脚本很陌生,所以可以想象脚本中有问题。

答案:

条件语句的计算结果始终为 false,因此if块中的代码永远不会被执行。

更多信息:

根据有关Sheet.getDataRange()方法的应用程序脚本文档:

返回与存在数据的维度对应的Range

这在功能上等效于创建一个以 A1 和 (Range.getLastColumn((, Range.getLastRow((( 为界的Range

这意味着当您调用ss.getDataRange()时,您将获得数据存在的整个范围,从A1开始。如果我们更进一步并查看Range.getColumn()的文档:

返回此区域的起始列位置。

这意味着对于使用Sheet.getDataRange()方法获取的Range对象,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
    • 从源表中删除行
    • 还要重新调整计数器,因为现在您的原点表现在少了一行

引用:

  • Sheet.getDataRange()
  • 班级范围 |应用脚本 |谷歌开发者
  • Range.getColumn()
  • Sheet.appendRow(rowContents)

试试这个:

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(e( 在用户更改电子表格中的值时运行。

最新更新