我希望脚本根据时间触发而不是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);
}
}
然后我进入将时间触发器设置为每分钟的时间。但这是行不通的-不能手动运行,也不能每分钟触发一次。我对脚本非常陌生,因此可以想象脚本中有什么问题。
有什么想法吗?
答案 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(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++;
});
}
运行以下代码:
8
,则将整行附加到工作表Test2
我希望这对您有帮助!