我正在尝试编写一个脚本,将标记为“已记录”的行从一个谷歌电子表格移动到另一个谷歌电子表格。我的脚本主要是基于这个脚本[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);
}`
最佳答案
快速浏览了一下。我认为您的代码不起作用,因为当您删除一行时,它会改变工作表结构,因此下一次删除将是错误的。
示例。您在电子表格的第 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 ;
}
}
希望这有帮助
关于javascript - 用于将行从一张纸移动到另一张纸的 Google 脚本的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28390564/