用于将行从一个工作表移动到另一个工作表的Google脚本的实现实现

时间:2015-02-08 04:27:23

标签: javascript google-apps-script google-sheets

我正在尝试编写一个脚本,将标记为“已记录”的行从一个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);         
 }`

2 个答案:

答案 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将保持结果数组及其原始顺序,并且我将始终指向电子表格中未改变的行。