我希望脚本基于时间触发器而不是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
- 从源表中删除行
- 还要重新调整计数器,因为现在您的原点表现在少了一行
- 如果 L 列中的单元格值为
引用:
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( 在用户更改电子表格中的值时运行。