几周前,我问了这个问题,并得到了很好的答复。基于此,我修改了已有的代码,它开始工作!基本上,代码将遍历工作表中的一列,并根据特定列中的值在工作表中移动特定行。根据建议,脚本将从下而上运行。这是我正在使用的东西:
function move2Archive() {
var columnNumberToWatch = 21; // column A = 1, B = 2, etc.
var valueToWatch = "Yes"; //needs to have a Yes in the column for script to work
var sheetNameToMoveTheRowTo = "4.Archive";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("3.Customer Tab");
var row = 1;
var range = sheet.getRange(row,columnNumberToWatch,sheet.getLastRow(),1).getValues(); //get Values of columnNumberToWatch
var range2 = sheet.getRange("B:B").getValues()
var len = range2.filter(String).length;
var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
//Browser.inputBox(len) //used this to debug and check whether the len variable is correct
for (row=len; row> 0 ; row--){
if (range[row-1][0] == valueToWatch) { //if the value in the column is the value to watch; index [0] method used to get value of the column of interest
var targetRow = targetSheet.getRange("B:B").getValues().filter(String).length //ensure that it is being pasted on the last row (using Unique ID column)
var targetRange = targetSheet.getRange(targetRow + 1, 1); //add 1 spaces to cater for the header row at the top
//Browser.inputBox(row) //used to debug and check where the values will paste
sheet.getRange(row, 1, 1, sheet.getLastColumn()).moveTo(targetRange);
sheet.deleteRow(row);
}
}
}
当我运行脚本时,它会无休止地运行,而不会将任何内容移至下一列。但是,当我运行“调试行”(即Browser.inputBox
命令)时,它们表明脚本确实可以正确设置参数。例如,第二个Browser.inputBox(row)
显示循环,并输出带有行号的输入框,其中找到了值“是”。问题在于,它只是无法执行,我也不知道为什么!我第一次使用它时工作正常,在有20个yes行的工作表上尝试后,它只是停止了一半... aaargh!
此外,只是为了使自己幸运,有没有办法加快脚本的速度?很高兴知道是否有一种更有效的方法来执行相同的过程。
谢谢!
答案 0 :(得分:0)
在尝试删除行之前,可能与moveTo
未完成有关。您尝试过flush
吗?
sheet.getRange(row, 1, 1, sheet.getLastColumn()).moveTo(targetRange);
SlreadsheetApp.flush();
sheet.deleteRow(row)