Google 脚本的实施,用于将行从一个 sheet 移动到另一个 sheet 实施
Implementation of Google script for Moving row from one sheet to another sheet Implementation
我正在尝试编写一个脚本,将标记为 "recorded" 的行从一个 google 电子表格移动到另一个电子表格。我的脚本主要基于这个脚本[link]。但是,在执行脚本时,它不会将所有记录的行从源电子表格移动到目标电子表格。我检查了 dest array(dest.length and 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);
}`
快速浏览了一下。我认为您的代码不起作用,因为当您删除一行时,它会改变 sheets 结构,因此下一次删除将是错误的。
例子。您在点差 sheet 的第 4 行找到匹配项。然后第 4 行在 sheet 中被删除。所以第 5 行现在变成第 4 行
i
增加 1,所以现在它位于 data
数组的第 5 行。如果找到匹配项,则删除 sheet 中的第 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
数组和 spreadsheet.
中删除该条目
然后 i
变量可以与行号保持同步。
类似的东西,同样未经测试
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 ;
}
}
希望对您有所帮助
我认为解决您的问题最简单的方法是从底部到顶部。
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 将保留结果数组及其原始顺序,并且我将始终指向电子表格中未更改的行。
我正在尝试编写一个脚本,将标记为 "recorded" 的行从一个 google 电子表格移动到另一个电子表格。我的脚本主要基于这个脚本[link]。但是,在执行脚本时,它不会将所有记录的行从源电子表格移动到目标电子表格。我检查了 dest array(dest.length and 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);
}`
快速浏览了一下。我认为您的代码不起作用,因为当您删除一行时,它会改变 sheets 结构,因此下一次删除将是错误的。
例子。您在点差 sheet 的第 4 行找到匹配项。然后第 4 行在 sheet 中被删除。所以第 5 行现在变成第 4 行
i
增加 1,所以现在它位于 data
数组的第 5 行。如果找到匹配项,则删除 sheet 中的第 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
数组和 spreadsheet.
然后 i
变量可以与行号保持同步。
类似的东西,同样未经测试
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 ;
}
}
希望对您有所帮助
我认为解决您的问题最简单的方法是从底部到顶部。
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 将保留结果数组及其原始顺序,并且我将始终指向电子表格中未更改的行。