我正在尝试编写一个脚本,将标记为“已记录”的行从一个Google电子表格移动到另一个。我的脚本主要基于此脚本[link]。但是,在执行脚本时,它不会将所有记录的行从源电子表格移动到目标电子表格。我检查了dest数组的值(dest.length和dest [0] .length)。但是我找不到任何错误,并非所有捕获的目标行都被删除,并且没有删除所有选定的行。我不熟悉javascript。如果有人能指出我正确的方向,那将是伟大的。此外,我不知道它是否重要,但源电子表格仍使用旧版本,而目标电子表格使用较新版本。
var s = SpreadsheetApp.openByUrl('Link1'); \\Source spreadsheet
var ss = s.getSheetByName('Sheet28');
var t = SpreadsheetApp.openByUrl('Link2'); \\target spreadsheet
var ts = t.getSheetByName('Sheet11');
var data = ss.getRange(1,1, ss.getLastRow(),ss.getLastColumn()).getValues();
var dest = [];
Logger.log(data.length)
for (var i = 1; i < data.length; i++ ){
if ( data[i][22] == 'recorded' && data[i][22] !="") {
dest.push(data[i]);
\\appending the array
ss.deleteRow(i);
\\delete the row
}}
Logger.log(dest.length);
if (dest.length > 0 && dest[0].length >0}{
ts.getRange(ts.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest);
}`
答案 0 :(得分:1)
快速浏览一下。我认为您的代码不起作用,因为当您删除一行时,它会改变工作表结构,因此下一次删除将是错误的。
实施例。您可以在电子表格的第4行中找到匹配项。然后在表格中删除第4行。所以第5行现在成为第4行
i
增加1,所以现在它位于data
数组的第5行。如果找到匹配项,则表单中的第5行将被删除,此时第4行应该被删除。
我唯一可以想到解决这个问题的方法是首先进行匹配,然后再进行删除,以此类推。
for (var i = 0; i < data.length; i++ ){
if ( data[i][0] == 'recorded') {
dest.push(data[i]);
}}
for (var x = 0; x < data.length; x++ ){
if ( data[x][0] == 'recorded') {
ss.deleteRow(x+1) ;
}}
也许这可能是一种解决方案,但尚未经过测试。
function moveData(){
var s = SpreadsheetApp.openByUrl('Link1');
var ss = s.getSheetByName('Sheet28');
var t = SpreadsheetApp.openByUrl('Link2');
var ts = t.getSheetByName('Sheet11');
var data = ss.getDataRange().getValues();
var dest = [];
for (var i = 0; i < data.length; i++ ){
if ( data[i][22] == 'recorded') {
dest.push(data[i]);
}}
for (var x = 0; x < data.length; x++ ){
if ( data[x][22] == 'recorded') {
ss.deleteRow(x+1) ;
}}
if (dest.length > 0 && dest[0].length >0){
ts.getRange(ts.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest);
}
}
修改
经过思考解决问题,或许是。如果该行匹配,请从data
数组和电子表格中删除该条目。
然后i
var可以与行号保持同步。
沿着这些方向的东西,再次未经测试
for (var i = 0; i < data.length; i++ ){
if ( data[i][22] == 'recorded') {
dest.push(data[i]);
ss.deleteRow(i+1) ;
delete data[i];
i= i -1 ;
}
}
我希望这会有所帮助
答案 1 :(得分:0)
我认为解决问题的最简单方法是从底部到顶部。
for (var i =data.length; i > 1; i-- ){
if ( data[i][22] == 'recorded' && data[i][22] !="") {
dest.unshift(data[i]);
\\appending the array
ss.deleteRow(i);
\\delete the row
}}
使用unshift而不是push将保持结果数组及其原始顺序,并且我将始终指向电子表格中未改变的行。